Skip to content

solidity-ide/antlr-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

antlr-parser

Parser for Ethereum's Solidity language generated by ANTLR4 and wrapped in RxJS.

Installation

npm i -S @solidity-ide/antlr-parser

Example

import "rxjs/add/operator/filter";
import { SolidityParser } from "../lib/SolidityParser";

const parser = new SolidityParser();

// Emits RuleContextEvents as it walks the tree.
parser.Observable()
    .filter(r => r.type !== "enterEveryRule" && r.type !== "exitEveryRule")
    .subscribe(
        rule => console.log(rule.type),
    );

// Emits syntax erros.
parser.ErrorObservable().subscribe(
        e => console.log(e),
    );

parser.parseFile("./contract.sol");
parser.parseFile("./contract2.sol", "./contact3.sol");
parser.parseFile(...["./contract4.sol", "./contact5.sol"]);

Documentation

SolidityParser Class

The main class for parsing Solidity code. Provides RX Observables that emit rule contexts and syntax errors.

One SolidityParser instance can be used to parse multiple files. Distinguish between files with enterSourceUnit and exitSourceUnit event types. Optionally, set the Observables to complete after the first parsing.

Constructor

constructor (fireComplete = false)

False by default. If true, the Observables will complete after the first parsing.

Methods

parseText (...code: string[]): void

Parses Solidity code provided as a string.

parseFile (...path: string[]): void

Loads and parses Solidity code from a file.

Observable (): Observable<IRuleContextEvent>

Emits Rule Context events as it walks the tree of parsed Solidity code.

ErrorObservable (): Observable<ISyntaxErrorEvent>

Emits any Syntax Error events from parsed Solidity code.

complete (): void

Cleans up the class. Basically invoking complete() on any Observables.

IRuleContextEvent Interface

Emited by SolidityParser#Observable().

export interface IRuleContextEvent {
    type: string;
    context: RuleContext;
}

ISyntaxErrorEvent Interface

Emitted by SolidityParser#ErrorObservable.

export interface ISyntaxErrorEvent {
    line: number;
    column: number;
    message: string;
    error: Error;
}

RuleContextEvent Types

The definitions for these rules can be found in the grammar definition (./bin/Solidity.g4).

Event types come in pairs: enter* and exit* events.

  • enterEveryRule <=> exitEveryRule (Included for completeness. More helpful to filter out.)
  • enterSourceUnit <=> exitSourceUnit (Marks the start and end of the document.)
  • enterPragmaDirective <=> exitPragmaDirective
  • enterPragmaName <=> exitPragmaName
  • enterPragmaValue <=> exitPragmaValue
  • enterVersion <=> exitVersion
  • enterVersionOperator <=> exitVersionOperator
  • enterVersionConstraint <=> exitVersionConstraint
  • enterImportDeclaration <=> exitImportDeclaration
  • enterImportDirective <=> exitImportDirective
  • enterContractDefinition <=> exitContractDefinition
  • enterInheritanceSpecifier <=> exitInheritanceSpecifier
  • enterContractPart <=> exitContractPart
  • enterStateVariableDeclaration <=> exitStateVariableDeclaration
  • enterUsingForDeclaration <=> exitUsingForDeclaration
  • enterStructDefinition <=> exitStructDefinition
  • enterModifierDefinition <=> exitModifierDefinition
  • enterFunctionDefinition <=> exitFunctionDefinition
  • enterEventDefinition <=> exitEventDefinition
  • enterEnumValue <=> exitEnumValue
  • enterEnumDefinition <=> exitEnumDefinition
  • enterIndexedParameterList <=> exitIndexedParameterList
  • enterParameterList <=> exitParameterList
  • enterTypeNameList <=> exitTypeNameList
  • enterVariableDeclaration <=> exitVariableDeclaration
  • enterTypeName <=> exitTypeName
  • enterUserDefinedTypeName <=> exitUserDefinedTypeName
  • enterMapping <=> exitMapping
  • enterFunctionTypeName <=> exitFunctionTypeName
  • enterStorageLocation <=> exitStorageLocation
  • enterBlock <=> exitBlock
  • enterStatement <=> exitStatement
  • enterExpressionStatement <=> exitExpressionStatement
  • enterIfStatement <=> exitIfStatement
  • enterWhileStatement <=> exitWhileStatement
  • enterPlaceholderStatement <=> exitPlaceholderStatement
  • enterSimpleStatement <=> exitSimpleStatement
  • enterForStatement <=> exitForStatement
  • enterInlineAssemblyStatement <=> exitInlineAssemblyStatement
  • enterDoWhileStatement <=> exitDoWhileStatement
  • enterContinueStatement <=> exitContinueStatement
  • enterBreakStatement <=> exitBreakStatement
  • enterReturnStatement <=> exitReturnStatement
  • enterThrowStatement <=> exitThrowStatement
  • enterVariableDeclarationStatement <=> exitVariableDeclarationStatement
  • enterIdentifierList <=> exitIdentifierList
  • enterElementaryTypeName <=> exitElementaryTypeName
  • enterExpression <=> exitExpression
  • enterPrimaryExpression <=> exitPrimaryExpression
  • enterExpressionList <=> exitExpressionList
  • enterNameValueList <=> exitNameValueList
  • enterFunctionCall <=> exitFunctionCall
  • enterFunctionCallArguments <=> exitFunctionCallArguments
  • enterNewExpression <=> exitNewExpression
  • enterInlineAssemblyBlock <=> exitInlineAssemblyBlock
  • enterAssemblyItem <=> exitAssemblyItem
  • enterAssemblyLocalBinding <=> exitAssemblyLocalBinding
  • enterAssemblyAssignment <=> exitAssemblyAssignment
  • enterFunctionalAssemblyExpression <=> exitFunctionalAssemblyExpression
  • enterArrayLiteral <=> exitArrayLiteral
  • enterTupleLiteral <=> exitTupleLiteral
  • enterElementaryTypeNameExpression <=> exitElementaryTypeNameExpression
  • enterNumberLiteral <=> exitNumberLiteral

Special Thanks

This library started with the ANTL4 grammar definition created by Federico Bond (@federicobond).


License GPL 3.0