在健壮的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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用JNA创建同一库的多个实例?   java在将Graphql查询作为JSON字符串传递时收到意外的令牌错误   OAuth2 oltu的java问题   java桌面应用程序使用的好的嵌入式数据库是什么?   java Firebase数据库高级查询选项   java正在使磁盘上的EhCache元素过期   java 安卓还原处于backstack中的片段的实例状态   XMemcached中的java异步集   java TimescaleDB是否使用与Postgresql完全相同的JDBC驱动程序?   java从网站c读取信息#   检查java Android中的字符串是否只包含数字和空格   c#如何向web服务发送特殊字符?   grails无法调用需要java的方法。lang.类参数?   java我在组合框中调用的方法不会运行所有代码,它只运行部分代码   java发送带有标头的HTTP GET请求