Created
January 14, 2011 15:40
-
-
Save matthewd/779751 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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