grammar JavaScript; options { language=Java; // output=AST; backtrack=true; memoize=true; } program : sourceElements EOF ; sourceElements : LT* ( sourceElement LT* )* ; sourceElement : functionDeclaration | statement ; functionDeclaration : 'function' LT* Identifier LT* formalParameterList LT* functionBody ; formalParameterList : '(' LT* ( Identifier ( LT* ',' LT* Identifier )* )? LT* ')' ; functionBody : '{' LT* sourceElements LT* '}' ; statement : emptyStatement | blockStatement ; emptyStatement : ';' ; blockStatement : '{' LT* statementList? LT* '}' ; statementList : statement ( LT* statement )* ; Identifier : IdentifierStart IdentifierPart* ; fragment IdentifierStart : UnicodeLetter | '$' | '_' ; fragment IdentifierPart : IdentifierStart | UnicodeDigit ; fragment UnicodeLetter : 'a'..'z' | 'A'..'Z' ; fragment UnicodeDigit : '0'..'9' ; // Line Terminator LT : '\n' | '\r' ; MultilineComment : '/*' (options { greedy=false; } : .)* '*/' { $channel=HIDDEN; } ; LineComment : '//' ~(LT)* { $channel=HIDDEN; } ; WhiteSpace : ( ' ' | '\t' | '\v' | '\f' ) { $channel=HIDDEN; } ;