grammar JS; ## whitespace token ws { | | } token whitespace { \t #? | \verttab | \f | \ #? | \nbsp #? | \usp #unicode sp } token newline { \n |\r #? |\LS #? |\PS } ## comments rule multilinecomment { } rule singlelinecomment { \/\/ * } ## keywords token keyword { break | case | catch | continue | default | delete | do | else | finally | for | function | if | in | instance | new | return | this | throw | try | typeof | var | void | while | with } token future_reserved_word { abstract | enum | int | short | boolean | export | interface | static | byte | extends | long | super | char | final | native | synchronized | class | float | package | throws | const | goto | private | transient | debugger | implements | protected | volatile } token reserved_word { | | | } ## literals rule literal { | | | } token null_literal {null} token boolean_literal {true|false} token numeric_lliteral { | } token decimal_literal { \.[\d+]? ? | \.\d+ ? | ? } token decimal_integer_literal { 0 |<[1..9]>\d+ } token exponent_part { <[eE]> <[+\-]> \d } token hex_integer_literal { 0<[xX]>+ } token hex_digits { <[0..9,a..f,A..F]> } token string_literal { | } token source_character { } token string_escape_sequence { [<['"bfnrtv]>|x+|u**{4}] } token unicode_escape_sequence { \\u**{4} } #token regular_expression_literal { #} ## identifiers ##token identifier { | get | set | include } token identifier { [|$|_|] [|$|_|]* } #token sim_qual_ident { # [ [ | ] <'::'> ]? #} #token exp_qual_ident { <'::'> } #token qual_ident { | qual_ident> } ## primary expressions rule primary_expression { this | | | | |\( \) } rule array_literal { \[ [,]* \] | [,]* [ \, [,]* ] [, [,]*]? } rule object_literal { \{ ? \} } rule property_name_and_value_list { \: [\, \: ]* } token property_name { || } ## member expression rule member_expression { | | \[ \] |\. |new } rule new_expression { [new]* } rule call_expression { [| \[ \] | \. ]* } rule arguments { \( [ [\, ]*]? \) } rule left_hand_side_expression { | } ##statements rule statement { | | | | | | | | | | | | | } rule block { \{ ? \} } rule statement_list { + } rule variable_statement { var \; } rule variable_declaration { ? } rule variable_declaration_no_in { ? } rule variable_declaration_list { [\, ]* } rule variable_declaration_list_no_in { [\, ]* } rule initializer { \= } rule initializer_no_in { \= } rule empyt_statement { \; } rule expression_statement { \; } ##lookahead not e ({, function}) see pdf rule if_statement { if \( \) [ else ]? } rule iteration_statement { do while \( \) \; | while \( \) | for \( ? \; ? \; ? \) | for \( var \; ? \; ? \) | for \( in \) | for \( var in \) } token contunue_statement { continue -? \; } token break_statement { continue -? \; } token return_statement { continue -? \; } rule with_statement { with \( \) } rule switch_statement { \( \) } rule case_block { \{ * ? * \} } rule case_clause { case \: ? } rule default_clause { default \: ? } rule labelled_statement { \: } token throw_statement { throw - \; } rule try_statement { try [ | | ] } rule catch { catch \( \) } rule catch { finally } rule expression { } rule expression_no_in { } ## function expressions ## function #token function_def { function } #rule function_name { | get token function_declaration { function } rule function_expression { function ? } rule function_common { \( [ [\, ]* ]? \) \{ + \} } ## programs rule program { + } rule source_element { | } ## class token class_def { class } token inheritance { | extends } # allowln ## namespace token namespace_def { namespace } ## package definition token package_def { package ? } token package_name { [ | ] } token package_ident { [ . ]? } ## regular expressions token pattern { } token disjunction { [ \| ]+ } token term { | ? } token assertion { <[^$]> | <'\b'> | <'\B'> } token quantifier { <[*+?]> \{ \d+ \,? \d+? \} } token atom { | | <'.'> | <'\'> | | <'('> [ <'?:'> | <'?='> | <'?!'> ]? <')'> } token pat_char { - <[^$\.*+?()[\]{}|]> } token atom_escape { | | } token char_esc { | | | | | } token cntl_esc { <[fnrtv]> } token cntl_let { <[a..zA..Z]> } token ident_esc { - } ## need to look these up and see if they're defined token dec_esc { } token char_class_esc { <[dDsSwW]> } #token char_class { } #( whole bunch of weird stuff here )