在健壮的antlr4语法基础上构建的python的可靠解析器
solidity-parser的Python项目详细描述
python固化分析器
在健壮的antlr4语法基础上构建的python的可靠解析器
这是由@federicobond维护的javascript antlr parser端口的python3端口。接口有意遵循javascript实现,因此不符合pep8。
安装
#> pip3 install solidity_parser
#> python3 -m solidity_parser <parse|outline> <path_to_contract.sol> # print parse tree or sourceUnit outline
如何
importsysimportpprintfromsolidity_parserimportparsersourceUnit=parser.parse_file(sys.argv[1])pprint.pprint(sourceUnit)# see output below
输出:
{'type': 'SourceUnit',
'children': [{'type': 'PragmaDirective',
'name': 'solidity',
'value': '^0.4.22'},
{'type': 'ContractDefinition'},
'baseContracts': [],
'kind': 'contract',
'name': 'SimpleAuction',
'subNodes': [{'initialValue': None,
'type': 'StateVariableDeclaration',
'variables': [{'expression': None,
'isDeclaredConst': False,
'isIndexed': False,
'isStateVar': True,
'name': 'beneficiary',
'type': 'VariableDeclaration',
'typeName': {'name': 'address',
'type': 'ElementaryTypeName'},
'visibility': 'public'}]},
...
节点
解析树节点可以像字典一样访问,也可以通过对象属性访问。节点总是携带一个type
字段来提示ast节点的类型。开始节点的类型总是sourceUnit
。
以面向对象的方式访问ast项
# ... continuing from previous snippet# subparse into objects for nicer interfaces:# create a nested object structure from ASTsourceUnitObject=parser.objectify(sourceUnit)# access imports, contracts, functions, ... (see outline example in __main__.py)sourceUnitObject.imports# []sourceUnitObject.pragmas# []sourceUnitObject.contracts.keys()# get all contract namessourceUnitObject.contracts["contractName"].functions.keys()# get all functions in contract: "contractName"sourceUnitObject.contracts["contractName"].functions["myFunction"].visibility# get "myFunction"s visibility (or stateMutability)
生成分析器
更新./solidity-antlr4/Solidity.g4
中的语法,并运行antlr生成器脚本以在solidity_parser/solidity_antlr4
中创建解析器类。
#> bash script/antlr4.sh