A Solidity parser for Python built on top of a robust ANTLR4 grammar
Project description
python-solidity-parser
An experimental Solidity parser for Python built on top of a robust ANTLR4 grammar.
ⓘ This is a python3 port of the javascript antlr parser maintained by @federicobond. Interfaces are intentionally following the javascript implementation and are therefore not pep8 compliant.
Install
#> pip3 install solidity_parser
#> python3 -m solidity_parser <parse|outline> <path_to_contract.sol> # print parse tree or sourceUnit outline
HowTo
import sys
import pprint
from solidity_parser import parser
sourceUnit = parser.parse_file(sys.argv[1], loc=False) # loc=True -> add location information to ast nodes
pprint.pprint(sourceUnit)
# see output below
output:
{'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'}]},
...
Nodes
Parse-tree nodes can be accessed both like dictionaries or via object attributes. Nodes always carry a type
field to hint the type of AST node. The start node is always of type sourceUnit
.
Accessing AST items in an Object Oriented fashion
# ... continuing from previous snippet
# subparse into objects for nicer interfaces:
# create a nested object structure from AST
sourceUnitObject = parser.objectify(sourceUnit)
# access imports, contracts, functions, ... (see outline example in __main__.py)
sourceUnitObject.imports # []
sourceUnitObject.pragmas # []
sourceUnitObject.contracts.keys() # get all contract names
sourceUnitObject.contracts["contractName"].functions.keys() # get all functions in contract: "contractName"
sourceUnitObject.contracts["contractName"].functions["myFunction"].visibility # get "myFunction"s visibility (or stateMutability)
Generate the parser
Update the grammar in ./solidity-antlr4/Solidity.g4
and run the antlr generator script to create the parser classes in solidity_parser/solidity_antlr4
.
#> bash script/antlr4.sh
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file solidity_parser-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: solidity_parser-0.1.1-py3-none-any.whl
- Upload date:
- Size: 67.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.8.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c00a584d2c8e15779c8e898155340b173e47dc1b202dfc2185ff418ac4bcdf8 |
|
MD5 | 254ee4df03fef01efde371e1f283f828 |
|
BLAKE2b-256 | deefc35a41a86e9437b0845ea713916399a23c5b914a90b8d8109c8eee0c66ba |