Skip to content

Instantly share code, notes, and snippets.

@matthewd
Created January 14, 2011 15:40
Show Gist options
  • Select an option

  • Save matthewd/779751 to your computer and use it in GitHub Desktop.

Select an option

Save matthewd/779751 to your computer and use it in GitHub Desktop.
Failed to match sequence (SP? SOURCE_ELEMENTS SP?) at line 1 char 1.
`- Failed to match sequence (SP? SOURCE_ELEMENTS SP?) at line 1 char 1.
`- Failed to match sequence (SOURCE_ELEMENT (SP? SOURCE_ELEMENT){0, }) at line 1 char 1.
`- Expected one of [FUNCTION_DECLARATION, STATEMENT]. at line 1 char 1.
|- Failed to match sequence ('function' SP IDENT SP? '(' SP? (FORMAL_PARAMETER_LIST SP?)? ')' SP? '{' SP? FUNCTION_BODY SP? '}') at line 1 char 1.
| `- Expected "function", but got "var x = " at line 1 char 1.
`- Expected one of [BLOCK, VARIABLE_STATEMENT, CONST_STATEMENT, EMPTY_STATEMENT, EXPR_STATEMENT, IF_STATEMENT, ITERATION_STATEMENT, CONTINUE_STATEMENT, BREAK_STATEMENT, RETURN_STATEMENT, WITH_STATEMENT, SWITCH_STATEMENT, LABELLED_STATEMENT, THROW_STATEMENT, TRY_STATEMENT]. at line 1 char 1.
|- Failed to match sequence ('{' SP? SOURCE_ELEMENTS SP? '}') at line 1 char 1.
| `- Expected "{", but got "v" at line 1 char 1.
|- Failed to match sequence ('var' SP VARIABLE_DECLARATION_LIST SP? (';' / ERROR)) at line 1 char 7.
| `- Expected one of [';', ERROR]. at line 1 char 7.
| |- Expected ";", but got "=" at line 1 char 7.
| `- Failed to match sequence (\\s{0, } '
') at line 1 char 7.
| `- Expected "\n", but got "=" at line 1 char 7.
|- Failed to match sequence ('const' SP CONST_DECLARATION_LIST SP? (';' / ERROR)) at line 1 char 1.
| `- Expected "const", but got "var x" at line 1 char 1.
|- Expected ";", but got "v" at line 1 char 1.
|- Failed to match sequence (EXPR_NO_BF SP? (';' / ERROR)) at line 1 char 1.
| `- Failed to match sequence (ASSIGNMENT_EXPR_NO_BF (SP? ',' SP? ASSIGNMENT_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence ((LEFT_HAND_SIDE_EXPR_NO_BF SP? ASSIGNMENT_OPERATOR SP?)? ASSIGNMENT_EXPR) at line 1 char 1.
| `- Failed to match sequence ((LEFT_HAND_SIDE_EXPR SP? ASSIGNMENT_OPERATOR SP?){0, } CONDITIONAL_EXPR) at line 1 char 1.
| `- Failed to match sequence (LOGICAL_OR_EXPR (SP? '?' SP? ASSIGNMENT_EXPR SP? ':' SP? ASSIGNMENT_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (LOGICAL_AND_EXPR (SP? '||' SP? LOGICAL_AND_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (BITWISE_OR_EXPR (SP? '&&' SP? BITWISE_OR_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (BITWISE_XOR_EXPR (SP? '|' SP? BITWISE_XOR_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (BITWISE_AND_EXPR (SP? '^' SP? BITWISE_AND_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (EQUALITY_EXPR (SP? '&' SP? EQUALITY_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (RELATIONAL_EXPR (SP? ('==' SP? RELATIONAL_EXPR / '!=' SP? RELATIONAL_EXPR / '===' SP? RELATIONAL_EXPR / '!==' SP? RELATIONAL_EXPR)){0, }) at line 1 char 1.
| `- Failed to match sequence (SHIFT_EXPR (SP? '<' SP? SHIFT_EXPR / SP? '>' SP? SHIFT_EXPR / SP? '<=' SP? SHIFT_EXPR / SP? '>=' SP? SHIFT_EXPR / SP 'instanceof' SP SHIFT_EXPR / SP 'in' SP SHIFT_EXPR){0, }) at line 1 char 1.
| `- Failed to match sequence (ADDITIVE_EXPR (SP? ('<<' SP? ADDITIVE_EXPR / '>>' SP? ADDITIVE_EXPR / '>>>' SP? ADDITIVE_EXPR)){0, }) at line 1 char 1.
| `- Failed to match sequence (MULTIPLICATIVE_EXPR (SP? ('+' SP? MULTIPLICATIVE_EXPR / '-' SP? MULTIPLICATIVE_EXPR)){0, }) at line 1 char 1.
| `- Failed to match sequence (UNARY_EXPR (SP? ('*' SP? UNARY_EXPR / '/' SP? UNARY_EXPR / '%' SP? UNARY_EXPR)){0, }) at line 1 char 1.
| `- Expected one of [UNARY_EXPR_COMMON, POSTFIX_EXPR]. at line 1 char 1.
| |- Expected one of ['delete' SP UNARY_EXPR, 'void' SP UNARY_EXPR, 'typeof' SP UNARY_EXPR, '++' SP? UNARY_EXPR, '--' SP? UNARY_EXPR, '+' SP? UNARY_EXPR, '-' SP? UNARY_EXPR, '~' SP? UNARY_EXPR, '!' SP? UNARY_EXPR]. at line 1 char 1.
| | |- Failed to match sequence ('delete' SP UNARY_EXPR) at line 1 char 1.
| | | `- Expected "delete", but got "var x " at line 1 char 1.
| | |- Failed to match sequence ('void' SP UNARY_EXPR) at line 1 char 1.
| | | `- Expected "void", but got "var " at line 1 char 1.
| | |- Failed to match sequence ('typeof' SP UNARY_EXPR) at line 1 char 1.
| | | `- Expected "typeof", but got "var x " at line 1 char 1.
| | |- Failed to match sequence ('++' SP? UNARY_EXPR) at line 1 char 1.
| | | `- Expected "++", but got "va" at line 1 char 1.
| | |- Failed to match sequence ('--' SP? UNARY_EXPR) at line 1 char 1.
| | | `- Expected "--", but got "va" at line 1 char 1.
| | |- Failed to match sequence ('+' SP? UNARY_EXPR) at line 1 char 1.
| | | `- Expected "+", but got "v" at line 1 char 1.
| | |- Failed to match sequence ('-' SP? UNARY_EXPR) at line 1 char 1.
| | | `- Expected "-", but got "v" at line 1 char 1.
| | |- Failed to match sequence ('~' SP? UNARY_EXPR) at line 1 char 1.
| | | `- Expected "~", but got "v" at line 1 char 1.
| | `- Failed to match sequence ('!' SP? UNARY_EXPR) at line 1 char 1.
| | `- Expected "!", but got "v" at line 1 char 1.
| `- Failed to match sequence (LEFT_HAND_SIDE_EXPR (SP? '++' / SP? '--')?) at line 1 char 1.
| `- Expected one of [NEW_EXPR, CALL_EXPR]. at line 1 char 1.
| |- Expected one of ['new' SP NEW_EXPR, MEMBER_EXPR]. at line 1 char 1.
| | |- Failed to match sequence ('new' SP NEW_EXPR) at line 1 char 1.
| | | `- Expected "new", but got "var" at line 1 char 1.
| | `- Failed to match sequence ((PRIMARY_EXPR / FUNCTION_EXPR / 'new' SP MEMBER_EXPR SP? ARGUMENTS) (SP? '[' SP? EXPR SP? ']' / SP? '.' SP? IDENT){1, }) at line 1 char 4.
| | `- Expected at least 1 of SP? '[' SP? EXPR SP? ']' / SP? '.' SP? IDENT at line 1 char 4.
| | `- Expected one of [SP? '[' SP? EXPR SP? ']', SP? '.' SP? IDENT]. at line 1 char 4.
| | |- Failed to match sequence (SP? '[' SP? EXPR SP? ']') at line 1 char 5.
| | | `- Expected "[", but got "x" at line 1 char 5.
| | `- Failed to match sequence (SP? '.' SP? IDENT) at line 1 char 5.
| | `- Expected ".", but got "x" at line 1 char 5.
| `- Failed to match sequence (MEMBER_EXPR SP? ARGUMENTS (SP? CALL_EXPR SP? (ARGUMENTS / '[' SP? EXPR SP? ']' / '.' SP? IDENT)){0, }) at line 1 char 1.
| `- Failed to match sequence ((PRIMARY_EXPR / FUNCTION_EXPR / 'new' SP MEMBER_EXPR SP? ARGUMENTS) (SP? '[' SP? EXPR SP? ']' / SP? '.' SP? IDENT){1, }) at line 1 char 4.
| `- Expected at least 1 of SP? '[' SP? EXPR SP? ']' / SP? '.' SP? IDENT at line 1 char 4.
| `- Expected one of [SP? '[' SP? EXPR SP? ']', SP? '.' SP? IDENT]. at line 1 char 4.
| |- Failed to match sequence (SP? '[' SP? EXPR SP? ']') at line 1 char 5.
| | `- Expected "[", but got "x" at line 1 char 5.
| `- Failed to match sequence (SP? '.' SP? IDENT) at line 1 char 5.
| `- Expected ".", but got "x" at line 1 char 5.
|- Failed to match sequence ('if' SP? '(' SP? EXPR SP? ')' SP? STATEMENT (SP? 'else' SP? STATEMENT)?) at line 1 char 1.
| `- Expected "if", but got "va" at line 1 char 1.
|- Expected one of ['do' SP? STATEMENT SP? 'while' SP? '(' SP? EXPR SP? ')' SP? (';' / ERROR), 'while' SP? '(' SP? EXPR SP? ')' SP? STATEMENT, 'for' SP? '(' SP? (EXPR_NO_IN SP?)? ';' SP? (EXPR SP?)? ';' SP? (EXPR SP?)? ')' SP? STATEMENT, 'for' SP? '(' SP? 'var' SP VARIABLE_DECLARATION_LIST_NO_IN SP? ';' SP? (EXPR SP?)? ';' SP? (EXPR SP?)? ')' SP? STATEMENT, 'for' '(' LEFT_HAND_SIDE_EXPR SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT, 'for' '(' 'var' SP IDENT SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT, 'for' '(' 'var' SP IDENT SP? '=' SP? ASSIGNMENT_EXPR_NO_IN SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT]. at line 1 char 1.
| |- Failed to match sequence ('do' SP? STATEMENT SP? 'while' SP? '(' SP? EXPR SP? ')' SP? (';' / ERROR)) at line 1 char 1.
| | `- Expected "do", but got "va" at line 1 char 1.
| |- Failed to match sequence ('while' SP? '(' SP? EXPR SP? ')' SP? STATEMENT) at line 1 char 1.
| | `- Expected "while", but got "var x" at line 1 char 1.
| |- Failed to match sequence ('for' SP? '(' SP? (EXPR_NO_IN SP?)? ';' SP? (EXPR SP?)? ';' SP? (EXPR SP?)? ')' SP? STATEMENT) at line 1 char 1.
| | `- Expected "for", but got "var" at line 1 char 1.
| |- Failed to match sequence ('for' SP? '(' SP? 'var' SP VARIABLE_DECLARATION_LIST_NO_IN SP? ';' SP? (EXPR SP?)? ';' SP? (EXPR SP?)? ')' SP? STATEMENT) at line 1 char 1.
| | `- Expected "for", but got "var" at line 1 char 1.
| |- Failed to match sequence ('for' '(' LEFT_HAND_SIDE_EXPR SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT) at line 1 char 1.
| | `- Expected "for", but got "var" at line 1 char 1.
| |- Failed to match sequence ('for' '(' 'var' SP IDENT SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT) at line 1 char 1.
| | `- Expected "for", but got "var" at line 1 char 1.
| `- Failed to match sequence ('for' '(' 'var' SP IDENT SP? '=' SP? ASSIGNMENT_EXPR_NO_IN SP 'in' SP (EXPR SP?)? ')' SP? STATEMENT) at line 1 char 1.
| `- Expected "for", but got "var" at line 1 char 1.
|- Failed to match sequence ('continue' (SP IDENT)? SP? (';' / ERROR)) at line 1 char 1.
| `- Expected "continue", but got "var x = " at line 1 char 1.
|- Failed to match sequence ('break' (SP IDENT)? SP? (';' / ERROR)) at line 1 char 1.
| `- Expected "break", but got "var x" at line 1 char 1.
|- Failed to match sequence ('return' SP? EXPR SP? (';' / ERROR)) at line 1 char 1.
| `- Expected "return", but got "var x " at line 1 char 1.
|- Failed to match sequence ('with' SP? '(' SP? EXPR SP? ')' SP? STATEMENT) at line 1 char 1.
| `- Expected "with", but got "var " at line 1 char 1.
|- Failed to match sequence ('switch' SP? '(' SP? EXPR SP? ')' SP? CASE_BLOCK) at line 1 char 1.
| `- Expected "switch", but got "var x " at line 1 char 1.
|- Failed to match sequence (IDENT SP? ':' SP? STATEMENT) at line 1 char 5.
| `- Expected ":", but got "x" at line 1 char 5.
|- Failed to match sequence ('throw' SP? EXPR SP? (';' / ERROR)) at line 1 char 1.
| `- Expected "throw", but got "var x" at line 1 char 1.
`- Failed to match sequence ('try' SP? BLOCK SP? ('finally' SP? BLOCK / 'catch' SP? '(' SP? IDENT SP? ')' SP? BLOCK (SP? 'finally' SP? BLOCK)?)) at line 1 char 1.
`- Expected "try", but got "var" at line 1 char 1.
require 'parslet'
class JSParser < Parslet::Parser
rule(:source_file) { sp? >> source_elements >> sp? }
root(:source_file)
rule(:source_elements) { source_element >> (sp? >> source_element).repeat }
rule(:source_element) { function_declaration | statement }
rule(:statement) {
block |
variable_statement |
const_statement |
empty_statement |
expr_statement |
if_statement |
iteration_statement |
continue_statement |
break_statement |
return_statement |
with_statement |
switch_statement |
labelled_statement |
throw_statement |
try_statement
}
rule(:literal) { str('null') | str('true') | str('false') | number | string | regexp }
rule(:property) {
(ident | string | number) >> sp? >> str(':') >> sp? >> assignment_expr |
ident >> sp >> ident >> sp? >> str('(') >> formal_parameter_list.maybe >> sp? >> str(')') >> sp? >> str('{') >> sp? >> function_body >> sp? >> str('}')
}
rule(:property_list) { (property >> sp? >> str(',') >> sp?).repeat >> property }
rule(:primary_expr) {
primary_expr_no_brace |
str('{') >> sp? >> (property_list >> sp? >> (str(',') >> sp?).maybe).maybe >> str('}')
}
rule(:primary_expr_no_brace) do
str('this') |
literal |
array_literal |
ident |
str('(') >> sp? >> expr >> sp? >> str(')')
end
rule(:array_literal) do
str('[') >> sp? >> element_list.maybe >> sp? >> elision.maybe >> sp? >> str(']')
end
rule(:element_list) do
(elision >> sp?).maybe >> (assignment_expr >> sp? >> str(',') >> sp? >> (elision >> sp?).maybe).repeat >> assignment_expr
end
rule(:elision) do
str(',') >> (sp? >> str(',')).repeat
end
rule(:member_expr) do
(
primary_expr |
function_expr |
str('new') >> sp >> member_expr >> sp? >> arguments
) >> (
sp? >> str('[') >> sp? >> expr >> sp? >> str(']') |
sp? >> str('.') >> sp? >> ident
).repeat(1)
end
rule(:member_expr_no_bf) do
(
primary_expr_no_brace |
str('new') >> sp >> member_expr >> sp? >> arguments
) >> (
sp? >> str('[') >> sp? >> expr >> sp? >> str(']') |
sp? >> str('.') >> sp? >> ident
).repeat(1)
end
rule(:new_expr) do
str('new') >> sp >> new_expr |
member_expr
end
rule(:new_expr_no_bf) do
str('new') >> sp >> new_expr |
member_expr_no_bf
end
rule(:call_expr) do
member_expr >> sp? >> arguments >>
(sp? >> call_expr >> sp? >>
(arguments |
str('[') >> sp? >> expr >> sp? >> str(']') |
str('.') >> sp? >> ident
)
).repeat
end
rule(:call_expr_no_bf) do
member_expr_no_bf >> sp? >> arguments >>
(sp? >> call_expr >> sp? >>
(arguments |
str('[') >> sp? >> expr >> sp? >> str(']') |
str('.') >> sp? >> ident
)
).repeat
end
rule(:arguments) do
str('(') >> sp? >> argument_list.maybe >> sp? >> str(')')
end
rule(:argument_list) do
assignment_expr >> (sp? >> str(',') >> sp? >> assignment_expr).repeat
end
rule(:left_hand_side_expr) do
new_expr |
call_expr
end
rule(:left_hand_side_expr_no_bf) do
new_expr_no_bf |
call_expr_no_bf
end
rule(:postfix_expr) do
left_hand_side_expr >> (sp? >> str('++') | sp? >> str('--')).maybe
end
rule(:postfix_expr_no_bf) do
left_hand_side_expr_no_bf >> (sp? >> str('++') | sp? >> str('--')).maybe
end
rule(:unary_expr_common) do
str('delete') >> sp >> unary_expr |
str('void') >> sp >> unary_expr |
str('typeof') >> sp >> unary_expr |
str('++') >> sp? >> unary_expr |
str('--') >> sp? >> unary_expr |
str('+') >> sp? >> unary_expr |
str('-') >> sp? >> unary_expr |
str('~') >> sp? >> unary_expr |
str('!') >> sp? >> unary_expr
end
rule(:unary_expr) do
unary_expr_common |
postfix_expr
end
rule(:unary_expr_no_bf) do
unary_expr_common |
postfix_expr_no_bf
end
rule(:multiplicative_expr) do
unary_expr >> (sp? >> (str('*') >> sp? >> unary_expr |
str('/') >> sp? >> unary_expr |
str('%') >> sp? >> unary_expr
)
).repeat
end
rule(:multiplicative_expr_no_bf) do
unary_expr_no_bf >> (sp? >> (str('*') >> sp? >> unary_expr |
str('/') >> sp? >> unary_expr |
str('%') >> sp? >> unary_expr
)
).repeat
end
rule(:additive_expr) do
multiplicative_expr >> (sp? >> (str('+') >> sp? >> multiplicative_expr |
str('-') >> sp? >> multiplicative_expr
)
).repeat
end
rule(:additive_expr_no_bf) do
multiplicative_expr_no_bf >> (sp? >> (str('+') >> sp? >> multiplicative_expr |
str('-') >> sp? >> multiplicative_expr
)
).repeat
end
rule(:shift_expr) do
additive_expr >> (sp? >> (str('<<') >> sp? >> additive_expr |
str('>>') >> sp? >> additive_expr |
str('>>>') >> sp? >> additive_expr
)
).repeat
end
rule(:shift_expr_no_bf) do
additive_expr_no_bf >> (sp? >> (str('<<') >> sp? >> additive_expr |
str('>>') >> sp? >> additive_expr |
str('>>>') >> sp? >> additive_expr
)
).repeat
end
rule(:relational_expr) do
shift_expr >> (sp? >> str('<') >> sp? >> shift_expr |
sp? >> str('>') >> sp? >> shift_expr |
sp? >> str('<=') >> sp? >> shift_expr |
sp? >> str('>=') >> sp? >> shift_expr |
sp >> str('instanceof') >> sp >> shift_expr |
sp >> str('in') >> sp >> shift_expr
).repeat
end
rule(:relational_expr_no_in) do
shift_expr_no_in >> (sp? >> str('<') >> sp? >> shift_expr |
sp? >> str('>') >> sp? >> shift_expr |
sp? >> str('<=') >> sp? >> shift_expr |
sp? >> str('>=') >> sp? >> shift_expr |
sp >> str('instanceof') >> sp >> shift_expr
).repeat
end
rule(:relational_expr_no_bf) do
shift_expr_no_bf >> (sp? >> str('<') >> sp? >> shift_expr |
sp? >> str('>') >> sp? >> shift_expr |
sp? >> str('<=') >> sp? >> shift_expr |
sp? >> str('>=') >> sp? >> shift_expr |
sp >> str('instanceof') >> sp >> shift_expr |
sp >> str('in') >> sp >> shift_expr
).repeat
end
rule(:equality_expr) do
relational_expr >> (sp? >> (str('==') >> sp? >> relational_expr |
str('!=') >> sp? >> relational_expr |
str('===') >> sp? >> relational_expr |
str('!==') >> sp? >> relational_expr
)
).repeat
end
rule(:equality_expr_no_in) do
relational_expr_no_in >> (sp? >> (str('==') >> sp? >> relational_expr_no_in |
str('!=') >> sp? >> relational_expr_no_in |
str('===') >> sp? >> relational_expr_no_in |
str('!==') >> sp? >> relational_expr_no_in
)
).repeat
end
rule(:equality_expr_no_bf) do
relational_expr_no_bf >> (sp? >> (str('==') >> sp? >> relational_expr |
str('!=') >> sp? >> relational_expr |
str('===') >> sp? >> relational_expr |
str('!==') >> sp? >> relational_expr
)
).repeat
end
rule(:bitwise_and_expr) do
equality_expr >> (sp? >> str('&') >> sp? >> equality_expr).repeat
end
rule(:bitwise_and_expr_no_in) do
equality_expr_no_in >> (sp? >> str('&') >> sp? >> equality_expr_no_in).repeat
end
rule(:bitwise_and_expr_no_bf) do
equality_expr_no_bf >> (sp? >> str('&') >> sp? >> equality_expr).repeat
end
rule(:bitwise_xor_expr) do
bitwise_and_expr >> (sp? >> str('^') >> sp? >> bitwise_and_expr).repeat
end
rule(:bitwise_xor_expr_no_in) do
bitwise_and_expr_no_in >> (sp? >> str('^') >> sp? >> bitwise_and_expr_no_in).repeat
end
rule(:bitwise_xor_expr_no_bf) do
bitwise_and_expr_no_bf >> (sp? >> str('^') >> sp? >> bitwise_and_expr).repeat
end
rule(:bitwise_or_expr) do
bitwise_xor_expr >> (sp? >> str('|') >> sp? >> bitwise_xor_expr).repeat
end
rule(:bitwise_or_expr_no_in) do
bitwise_xor_expr_no_in >> (sp? >> str('|') >> sp? >> bitwise_xor_expr_no_in).repeat
end
rule(:bitwise_or_expr_no_bf) do
bitwise_xor_expr_no_bf >> (sp? >> str('|') >> sp? >> bitwise_xor_expr).repeat
end
rule(:logical_and_expr) do
bitwise_or_expr >> (sp? >> str('&&') >> sp? >> bitwise_or_expr).repeat
end
rule(:logical_and_expr_no_in) do
bitwise_or_expr_no_in >> (sp? >> str('&&') >> sp? >> bitwise_or_expr_no_in).repeat
end
rule(:logical_and_expr_no_bf) do
bitwise_or_expr_no_bf >> (sp? >> str('&&') >> sp? >> bitwise_or_expr).repeat
end
rule(:logical_or_expr) do
logical_and_expr >> (sp? >> str('||') >> sp? >> logical_and_expr).repeat
end
rule(:logical_or_expr_no_in) do
logical_and_expr_no_in >> (sp? >> str('||') >> sp? >> logical_and_expr_no_in).repeat
end
rule(:logical_or_expr_no_bf) do
logical_and_expr_no_bf >> (sp? >> str('||') >> sp? >> logical_and_expr).repeat
end
rule(:conditional_expr) do
logical_or_expr >> (sp? >> str('?') >> sp? >> assignment_expr >> sp? >> str(':') >> sp? >> assignment_expr).repeat
end
rule(:conditional_expr_no_in) do
logical_or_expr_no_in >> (sp? >> str('?') >> sp? >> assignment_expr_no_in >> sp? >> str(':') >> sp? >> assignment_expr_no_in).repeat
end
rule(:conditional_expr_no_bf) do
logical_or_expr_no_bf >> (sp? >> str('?') >> sp? >> assignment_expr >> sp? >> str(':') >> sp? >> assignment_expr).repeat
end
rule(:assignment_expr) do
(left_hand_side_expr >> sp? >> assignment_operator >> sp?).repeat >> conditional_expr
end
rule(:assignment_expr_no_in) do
(left_hand_side_expr >> sp? >> assignment_operator >> sp?).repeat >> conditional_expr_no_in
end
rule(:assignment_expr_no_bf) do
(left_hand_side_expr_no_bf >> sp? >> assignment_operator >> sp?).maybe >> assignment_expr
end
rule(:assignment_operator) do
str('=') |
str('+=') |
str('-=') |
str('*=') |
str('/=') |
str('<<=') |
str('>>=') |
str('>>>=') |
str('&=') |
str('^=') |
str('|=') |
str('%=')
end
rule(:expr) do
assignment_expr >> (sp? >> str(',') >> sp? >> assignment_expr).repeat
end
rule(:expr_no_in) do
assignment_expr_no_in >> (sp? >> str(',') >> sp? >> assignment_expr_no_in).repeat
end
rule(:expr_no_bf) do
assignment_expr_no_bf >> (sp? >> str(',') >> sp? >> assignment_expr).repeat
end
rule(:block) do
str('{') >> sp? >> source_elements >> sp? >> str('}')
end
rule(:variable_statement) do
str('var') >> sp >> variable_declaration_list >> sp? >> (str(';') | error)
end
rule(:variable_declaration_list) do
variable_declaration >> (sp? >> str(',') >> sp? >> variable_declaration).repeat
end
rule(:variable_declaration_list_no_in) do
variable_declaration_no_in >> (sp? >> str(',') >> sp? >> variable_declaration_no_in).repeat
end
rule(:variable_declaration) do
ident >> sp? >> str('=') >> sp? >> assignment_expr | ident
end
rule(:variable_declaration_no_in) do
ident >> (sp? >> str('=') >> sp? >> assignment_expr_no_in).maybe
end
rule(:const_statement) do
str('const') >> sp >> const_declaration_list >> sp? >> (str(';') | error)
end
rule(:const_declaration_list) do
(const_declaration >> sp? >> str(',') >> sp?).repeat >> const_declaration
end
rule(:const_declaration) do
ident >> (sp? >> str('=') >> sp? >> assignment_expr).maybe
end
rule(:empty_statement) do
str(';')
end
rule(:expr_statement) do
expr_no_bf >> sp? >> (str(';') | error)
end
rule(:if_statement) do
str('if') >> sp? >> str('(') >> sp? >> expr >> sp? >> str(')') >> sp? >> statement >> (sp? >> str('else') >> sp? >> statement).maybe
end
rule(:iteration_statement) do
str('do') >> sp? >> statement >> sp? >> str('while') >> sp? >> str('(') >> sp? >> expr >> sp? >> str(')') >> sp? >> (str(';') | error) |
str('while') >> sp? >> str('(') >> sp? >> expr >> sp? >> str(')') >> sp? >> statement |
str('for') >> sp? >> str('(') >> sp? >> (expr_no_in >> sp?).maybe >> str(';') >> sp? >> (expr >> sp?).maybe >> str(';') >> sp? >> (expr >> sp?).maybe >> str(')') >> sp? >> statement |
str('for') >> sp? >> str('(') >> sp? >> str('var') >> sp >> variable_declaration_list_no_in >> sp? >> str(';') >> sp? >> (expr >> sp?).maybe >> str(';') >> sp? >> (expr >> sp?).maybe >> str(')') >> sp? >> statement |
str('for') >> str('(') >> left_hand_side_expr >> sp >> str('in') >> sp >> (expr >> sp?).maybe >> str(')') >> sp? >> statement |
str('for') >> str('(') >> str('var') >> sp >> ident >> sp >> str('in') >> sp >> (expr >> sp?).maybe >> str(')') >> sp? >> statement |
str('for') >> str('(') >> str('var') >> sp >> ident >> sp? >> str('=') >> sp? >> assignment_expr_no_in >> sp >> str('in') >> sp >> (expr >> sp?).maybe >> str(')') >> sp? >> statement
end
rule(:continue_statement) do
str('continue') >> (sp >> ident).maybe >> sp? >> (str(';') | error)
end
rule(:break_statement) do
str('break') >> (sp >> ident).maybe >> sp? >> (str(';') | error)
end
rule(:return_statement) do
str('return') >> sp? >> (expr >> sp?) >> (str(';') | error)
end
rule(:with_statement) do
str('with') >> sp? >> str('(') >> sp? >> expr >> sp? >> str(')') >> sp? >> statement
end
rule(:switch_statement) do
str('switch') >> sp? >> str('(') >> sp? >> expr >> sp? >> str(')') >> sp? >> case_block
end
rule(:case_block) do
str('{') >> sp? >> case_clause.repeat >> (default_clause >> case_clause.repeat).maybe >> str('}')
end
rule(:case_clause) do
str('case') >> sp? >> expr >> sp? >> str(':') >> sp? >> source_elements >> sp?
end
rule(:case_clause) do
str('default') >> sp? >> str(':') >> sp? >> source_elements >> sp?
end
rule(:labelled_statement) do
ident >> sp? >> str(':') >> sp? >> statement
end
rule(:throw_statement) do
str('throw') >> sp? >> expr >> sp? >> (str(';') | error)
end
rule(:try_statement) do
str('try') >> sp? >> block >> sp? >> (str('finally') >> sp? >> block |
str('catch') >> sp? >> str('(') >> sp? >> ident >> sp? >> str(')') >> sp? >> block >> (sp? >> str('finally') >> sp? >> block).maybe
)
end
rule(:function_declaration) do
str('function') >> sp >> ident >> sp? >> str('(') >> sp? >> (formal_parameter_list >> sp?).maybe >> str(')') >> sp? >> str('{') >> sp? >> function_body >> sp? >> str('}')
end
rule(:function_expr) do
str('function') >> (sp >> ident).maybe >> sp? >> str('(') >> sp? >> (formal_parameter_list >> sp?).maybe >> str(')') >> sp? >> str('{') >> sp? >> function_body >> sp? >> str('}')
end
rule(:formal_parameter_list) do
ident >> (sp? >> str(',') >> sp? >> ident).repeat
end
rule(:function_body) do
source_elements
end
rule(:string) do
str(%(")) >> (str("\\") >> any | match(%([^"\]))).repeat >> str(%(")) |
str(%(')) >> (str("\\") >> any | match(%([^'\]))).repeat >> str(%('))
end
rule(:number) do
float | integer
end
rule(:float) do
digit.repeat(1) >> str('.') >> digit.repeat >> (match['eE'] >> match['-+'].maybe >> digit.repeat(1)).maybe |
digit.repeat(1) >> (str('.') >> digit.repeat).maybe >> match['eE'] >> match['-+'].maybe >> digit.repeat(1) |
str('.') >> digit.repeat(1) >> (match['eE'] >> match['-+'].maybe >> digit.repeat(1)).maybe
end
rule(:integer) do
str('0') >> (match['xX'] >> match['0-9a-fA-F'].repeat(1) | match['0-7'].repeat) | digit.repeat(1)
end
rule(:digit) do
match['0-9']
end
rule(:regexp) do
str('/') >> (
match("[^\\[\\/]").repeat(1) |
str("\\") >> any |
str('[') >> str('^').maybe >> str(']').maybe >> (match['^]'].repeat(1) | str("\\") >> any).repeat >> str(']')
).repeat >> str('/') >> match['gim'].repeat
end
rule(:ident) do
match['A-Za-z_$'] >> match['A-Za-z0-9_$'].repeat
end
rule(:error) do
match('\s').repeat >> str("\n")
end
rule(:sp) do
match("[ \t\n]").repeat(1) |
str("//") >> any.repeat |
str("/*") >> match('[^*]|\*(?!/)').repeat >> str('*/')
end
rule(:sp?) { sp.repeat }
end
x = JSParser.new
begin
p x.parse(<<-CODE)
var x = 7, y = 9; var a = 2
CODE
rescue Parslet::ParseFailed => error
puts error, x.root.error_tree
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment