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 )