Code Monkey home page Code Monkey logo

jison-debugger's Introduction

jison-debugger No Maintenance Intended

Web UI for debugging Jison grammars, written in React.js.

Setup: npm install && bower install

Developing: use gulp watch. This was created with a Yeoman generator.

Recompiling Jison: npm run build-jison. I'm using a special build of Jison for debugging.

Deploying to gh-pages: use npm run deploy. It will build the project and push to the gh-pages branch.

jison-debugger's People

Contributors

nolanlawson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

jison-debugger's Issues

Works in jison-debugger but conflicts are thrown with jison CLI

Hi,
That's a fantastic tool that helps visually understand and test the structure of the grammar. I noticed that in some cases jison-debugger doesn't give the same result as jison CLI-tool.
In sample calculator logic below jison-debugger works just fine and allows me to test the grammar. When I'm trying to generate JS with jison CLI, it fails with conflicts due to ' | number matrixExpression { $$ = 'num * M'; }' line.

I would appreciate if you have any comments. Thank you.

`%lex

%expect 2

/* lexical grammar /
%%
\s+ {/
skip whitespace */}
[0-9]+("."[0-9]+)?\b {return 'NUMBER';}

"" {return '';};
"/" {return '/';}
"-" {return '-';}
"+" {return '+';}
"(" {return '(';}
")" {return ')'}
"{" {return '{';}
"}" {return '}'}
"\left(" {return '(';}
"\right)" {return ')';}
"det" {return 'DET';}

[(([\d[],][^])*)]|[A-F] {return 'MATRIX';}

"\u2A2F" {return 'CROSS_PRODUCT';}
"\u22C5" {return '*';}

"{-1}" {return 'INVERSE';}
"\u2297" {return 'TENSOR_PRODUCT';}
"{T}" {return 'TRANSPOSE';}
"^" {return 'MATRIX_POWER';}

<> {return 'EOF';}
/lex

/* operator precedence/associations */

%left '+' '-' '(' '{'
%left '*' '/'
%right ')' '}'
%right 'DET'
%left 'TENSOR_PRODUCT' 'CROSS_PRODUCT' 'MATRIX_POWER'
%left UMINUS

%start expressions

%% /* language grammar */

expressions:
numbers EOF {return $1;}
| matrixExpression EOF {return $1;}
;

number :
NUMBER { $$ = Number(yytext); }
| '-' number %prec UMINUS { $$ = -$2;}
| '(' number ')' { $$ = $2; }
| number '+' number { $$ = $1 + $3; }
| number '-' number { $$ = $1 - $3; }
| number '*' number { $$ = $1 * $3; }
| number '/' number { $$ = $1 / $3; }
| DET '(' matrixExpression ')' { $$ = '999' }
;

matrixExpression :

MATRIX { $$ = "matrix"; }
| '(' matrixExpression ')' { $$ = $2; }
| matrixExpression '' matrixExpression { $$ = 'M multiply M'; }
| matrixExpression '+' matrixExpression { $$ = 'M + M'; }
| matrixExpression '-' matrixExpression { $$ = 'M - M'; }
| matrixExpression '
' number { $$ = 'M * num'; }
| number '*' matrixExpression { $$ = 'num * M'; }
| number matrixExpression { $$ = 'num * M'; }
| matrixExpression MATRIX_POWER '{' number '}' { $$ = 'M pow ' + $4 }
| matrixExpression MATRIX_POWER TRANSPOSE { $$ = 'M transpose' }
| matrixExpression MATRIX_POWER INVERSE { $$ = 'M inverse' }
| matrixExpression CROSS_PRODUCT matrixExpression { $$ = 'M cross prod M' }
| matrixExpression TENSOR_PRODUCT matrixExpression { $$ = 'M tensor prod M' }
;
`

Feature request : permalinks

For sharing, add a permalink button. most playgrounds do the following:

  1. encode the sources or turn them into Base64
  2. put them in the url as params/hashes

When called

  1. if called with params
  2. decode params
  3. put the sources in place
  4. compile

Thanks :D

Zoomable SVGs

With a sufficient complex grammar, the parse tree can be so large that it's hard to read the text or see how the nodes are related. It gets scaled down to a really small size.

Since these are SVGs, it seems like there ought to be an easy way to make the "fullscreen" view zoomable. But I haven't figured out how to do so yet.

Error on CoffeeScript’s grammar

I took the grammer JSON object exported by CoffeeScript’s grammar.coffee, ran it through json2jison to get a grammar text file, and pasted that grammar text file into your app. I got the error:

Object prototype may only be an Object or null: undefined

Here is the grammar text file:

%left POST_IF
%right IF ELSE FOR WHILE UNTIL LOOP SUPER CLASS IMPORT EXPORT
%right FORIN FOROF FORFROM BY WHEN
%right '=' ':' COMPOUND_ASSIGN RETURN THROW EXTENDS
%right YIELD
%nonassoc INDENT OUTDENT
%left BIN?
%left '||'
%left '&&'
%left '|'
%left '^'
%left '&'
%left COMPARE
%left RELATION
%left SHIFT
%left '+' '-'
%left MATH
%right UNARY_MATH
%right '**'
%right AWAIT
%right UNARY
%left '?'
%nonassoc '++' '--'
%left CALL_START CALL_END
%left '.' '?.' '::' '?::'

%%

Root
    : 
        {return $$ = yy.addLocationDataFn(@1, @1)(new yy.Block);}
    | Body
        {return $$ = $1;}
    ;

Body
    : Line
        {$$ = yy.addLocationDataFn(@1, @1)(yy.Block.wrap([$1]));}
    | Body TERMINATOR Line
        {$$ = yy.addLocationDataFn(@1, @3)($1.push($3));}
    | Body TERMINATOR
        {$$ = $1;}
    ;

Line
    : Expression
        {$$ = $1;}
    | Statement
        {$$ = $1;}
    | FuncDirective
        {$$ = $1;}
    ;

FuncDirective
    : YieldReturn
        {$$ = $1;}
    | AwaitReturn
        {$$ = $1;}
    ;

Statement
    : Return
        {$$ = $1;}
    | Comment
        {$$ = $1;}
    | STATEMENT
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.StatementLiteral($1));}
    | Import
        {$$ = $1;}
    | Export
        {$$ = $1;}
    ;

Expression
    : Value
        {$$ = $1;}
    | Invocation
        {$$ = $1;}
    | Code
        {$$ = $1;}
    | Operation
        {$$ = $1;}
    | Assign
        {$$ = $1;}
    | If
        {$$ = $1;}
    | Try
        {$$ = $1;}
    | While
        {$$ = $1;}
    | For
        {$$ = $1;}
    | Switch
        {$$ = $1;}
    | Class
        {$$ = $1;}
    | Throw
        {$$ = $1;}
    | Yield
        {$$ = $1;}
    ;

Yield
    : YIELD
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Op($1, new yy.Value(new yy.Literal(''))));}
    | YIELD Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
    | YIELD FROM Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($1.concat($2), $3));}
    ;

Block
    : INDENT OUTDENT
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Block);}
    | INDENT Body OUTDENT
        {$$ = yy.addLocationDataFn(@1, @3)($2);}
    ;

Identifier
    : IDENTIFIER
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.IdentifierLiteral($1));}
    ;

Property
    : PROPERTY
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.PropertyName($1));}
    ;

AlphaNumeric
    : NUMBER
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.NumberLiteral($1));}
    | String
        {$$ = $1;}
    ;

String
    : STRING
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.StringLiteral($1));}
    | STRING_START Body STRING_END
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.StringWithInterpolations($2));}
    ;

Regex
    : REGEX
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.RegexLiteral($1));}
    | REGEX_START Invocation REGEX_END
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.RegexWithInterpolations($2.args));}
    ;

Literal
    : AlphaNumeric
        {$$ = $1;}
    | JS
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.PassthroughLiteral($1));}
    | Regex
        {$$ = $1;}
    | UNDEFINED
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.UndefinedLiteral);}
    | NULL
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.NullLiteral);}
    | BOOL
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.BooleanLiteral($1));}
    | INFINITY
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.InfinityLiteral($1));}
    | NAN
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.NaNLiteral);}
    ;

Assign
    : Assignable '=' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign($1, $3));}
    | Assignable '=' TERMINATOR Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Assign($1, $4));}
    | Assignable '=' INDENT Expression OUTDENT
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign($1, $4));}
    ;

AssignObj
    : ObjAssignable
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | ObjAssignable ':' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $3, 'object', {
          operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
        }));}
    | ObjAssignable ':' INDENT Expression OUTDENT
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $4, 'object', {
          operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
        }));}
    | SimpleObjAssignable '=' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $3, null, {
          operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
        }));}
    | SimpleObjAssignable '=' INDENT Expression OUTDENT
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign(yy.addLocationDataFn(@1)(new yy.Value($1)), $4, null, {
          operatorToken: yy.addLocationDataFn(@2)(new yy.Literal($2))
        }));}
    | Comment
        {$$ = $1;}
    ;

SimpleObjAssignable
    : Identifier
        {$$ = $1;}
    | Property
        {$$ = $1;}
    | ThisProperty
        {$$ = $1;}
    ;

ObjAssignable
    : SimpleObjAssignable
        {$$ = $1;}
    | AlphaNumeric
        {$$ = $1;}
    ;

Return
    : RETURN Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Return($2));}
    | RETURN
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Return);}
    ;

YieldReturn
    : YIELD RETURN Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.YieldReturn($3));}
    | YIELD RETURN
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.YieldReturn);}
    ;

AwaitReturn
    : AWAIT RETURN Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.AwaitReturn($3));}
    | AWAIT RETURN
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.AwaitReturn);}
    ;

Comment
    : HERECOMMENT
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Comment($1));}
    ;

Code
    : PARAM_START ParamList PARAM_END FuncGlyph Block
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Code($2, $5, $4));}
    | FuncGlyph Block
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Code([], $2, $1));}
    ;

FuncGlyph
    : '->'
        {$$ = yy.addLocationDataFn(@1, @1)('func');}
    | '=>'
        {$$ = yy.addLocationDataFn(@1, @1)('boundfunc');}
    ;

OptComma
    : 
        {$$ = $1;}
    | ','
        {$$ = $1;}
    ;

ParamList
    : 
        {$$ = yy.addLocationDataFn(@1, @1)([]);}
    | Param
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | ParamList ',' Param
        {$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
    | ParamList OptComma TERMINATOR Param
        {$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
    | ParamList OptComma INDENT ParamList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
    ;

Param
    : ParamVar
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Param($1));}
    | ParamVar '...'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Param($1, null, true));}
    | ParamVar '=' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Param($1, $3));}
    | '...'
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Expansion);}
    ;

ParamVar
    : Identifier
        {$$ = $1;}
    | ThisProperty
        {$$ = $1;}
    | Array
        {$$ = $1;}
    | Object
        {$$ = $1;}
    ;

Splat
    : Expression '...'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Splat($1));}
    ;

SimpleAssignable
    : Identifier
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | Value Accessor
        {$$ = yy.addLocationDataFn(@1, @2)($1.add($2));}
    | Invocation Accessor
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Value($1, [].concat($2)));}
    | ThisProperty
        {$$ = $1;}
    ;

Assignable
    : SimpleAssignable
        {$$ = $1;}
    | Array
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | Object
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    ;

Value
    : Assignable
        {$$ = $1;}
    | Literal
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | Parenthetical
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | Range
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | This
        {$$ = $1;}
    | Super
        {$$ = $1;}
    ;

Super
    : SUPER '.' Property
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Super(yy.addLocationDataFn(@3)(new yy.Access($3))));}
    | SUPER INDEX_START Expression INDEX_END
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Super(yy.addLocationDataFn(@3)(new yy.Index($3))));}
    ;

Accessor
    : '.' Property
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Access($2));}
    | '?.' Property
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Access($2, 'soak'));}
    | '::' Property
        {$$ = yy.addLocationDataFn(@1, @2)([yy.addLocationDataFn(@1)(new yy.Access(new yy.PropertyName('prototype'))), yy.addLocationDataFn(@2)(new yy.Access($2))]);}
    | '?::' Property
        {$$ = yy.addLocationDataFn(@1, @2)([yy.addLocationDataFn(@1)(new yy.Access(new yy.PropertyName('prototype'), 'soak')), yy.addLocationDataFn(@2)(new yy.Access($2))]);}
    | '::'
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Access(new yy.PropertyName('prototype')));}
    | Index
        {$$ = $1;}
    ;

Index
    : INDEX_START IndexValue INDEX_END
        {$$ = yy.addLocationDataFn(@1, @3)($2);}
    | INDEX_SOAK Index
        {$$ = yy.addLocationDataFn(@1, @2)(yy.extend($2, {
          soak: true
        }));}
    ;

IndexValue
    : Expression
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Index($1));}
    | Slice
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Slice($1));}
    ;

Object
    : '{' AssignList OptComma '}'
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Obj($2, $1.generated));}
    ;

AssignList
    : 
        {$$ = yy.addLocationDataFn(@1, @1)([]);}
    | AssignObj
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | AssignList ',' AssignObj
        {$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
    | AssignList OptComma TERMINATOR AssignObj
        {$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
    | AssignList OptComma INDENT AssignList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
    ;

Class
    : CLASS
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Class);}
    | CLASS Block
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Class(null, null, $2));}
    | CLASS EXTENDS Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Class(null, $3));}
    | CLASS EXTENDS Expression Block
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Class(null, $3, $4));}
    | CLASS SimpleAssignable
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Class($2));}
    | CLASS SimpleAssignable Block
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Class($2, null, $3));}
    | CLASS SimpleAssignable EXTENDS Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Class($2, $4));}
    | CLASS SimpleAssignable EXTENDS Expression Block
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Class($2, $4, $5));}
    ;

Import
    : IMPORT String
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.ImportDeclaration(null, $2));}
    | IMPORT ImportDefaultSpecifier FROM String
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.ImportDeclaration(new yy.ImportClause($2, null), $4));}
    | IMPORT ImportNamespaceSpecifier FROM String
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.ImportDeclaration(new yy.ImportClause(null, $2), $4));}
    | IMPORT '{' '}' FROM String
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList([])), $5));}
    | IMPORT '{' ImportSpecifierList OptComma '}' FROM String
        {$$ = yy.addLocationDataFn(@1, @7)(new yy.ImportDeclaration(new yy.ImportClause(null, new yy.ImportSpecifierList($3)), $7));}
    | IMPORT ImportDefaultSpecifier ',' ImportNamespaceSpecifier FROM String
        {$$ = yy.addLocationDataFn(@1, @6)(new yy.ImportDeclaration(new yy.ImportClause($2, $4), $6));}
    | IMPORT ImportDefaultSpecifier ',' '{' ImportSpecifierList OptComma '}' FROM String
        {$$ = yy.addLocationDataFn(@1, @9)(new yy.ImportDeclaration(new yy.ImportClause($2, new yy.ImportSpecifierList($5)), $9));}
    ;

ImportSpecifierList
    : ImportSpecifier
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | ImportSpecifierList ',' ImportSpecifier
        {$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
    | ImportSpecifierList OptComma TERMINATOR ImportSpecifier
        {$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
    | INDENT ImportSpecifierList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @4)($2);}
    | ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
    ;

ImportSpecifier
    : Identifier
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportSpecifier($1));}
    | Identifier AS Identifier
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportSpecifier($1, $3));}
    | DEFAULT
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportSpecifier(new yy.Literal($1)));}
    | DEFAULT AS Identifier
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportSpecifier(new yy.Literal($1), $3));}
    ;

ImportDefaultSpecifier
    : Identifier
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.ImportDefaultSpecifier($1));}
    ;

ImportNamespaceSpecifier
    : IMPORT_ALL AS Identifier
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ImportNamespaceSpecifier(new yy.Literal($1), $3));}
    ;

Export
    : EXPORT '{' '}'
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));}
    | EXPORT '{' ExportSpecifierList OptComma '}'
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($3)));}
    | EXPORT Class
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.ExportNamedDeclaration($2));}
    | EXPORT Identifier '=' Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.ExportNamedDeclaration(new yy.Assign($2, $4, null, {
          moduleDeclaration: 'export'
        })));}
    | EXPORT Identifier '=' TERMINATOR Expression
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.ExportNamedDeclaration(new yy.Assign($2, $5, null, {
          moduleDeclaration: 'export'
        })));}
    | EXPORT Identifier '=' INDENT Expression OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)(new yy.ExportNamedDeclaration(new yy.Assign($2, $5, null, {
          moduleDeclaration: 'export'
        })));}
    | EXPORT DEFAULT Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportDefaultDeclaration($3));}
    | EXPORT EXPORT_ALL FROM String
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.ExportAllDeclaration(new yy.Literal($2), $4));}
    | EXPORT '{' ExportSpecifierList OptComma '}' FROM String
        {$$ = yy.addLocationDataFn(@1, @7)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($3), $7));}
    ;

ExportSpecifierList
    : ExportSpecifier
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | ExportSpecifierList ',' ExportSpecifier
        {$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
    | ExportSpecifierList OptComma TERMINATOR ExportSpecifier
        {$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
    | INDENT ExportSpecifierList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @4)($2);}
    | ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
    ;

ExportSpecifier
    : Identifier
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.ExportSpecifier($1));}
    | Identifier AS Identifier
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier($1, $3));}
    | Identifier AS DEFAULT
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier($1, new yy.Literal($3)));}
    | DEFAULT
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.ExportSpecifier(new yy.Literal($1)));}
    | DEFAULT AS Identifier
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.ExportSpecifier(new yy.Literal($1), $3));}
    ;

Invocation
    : Value OptFuncExist String
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.TaggedTemplateCall($1, $3, $2));}
    | Value OptFuncExist Arguments
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Call($1, $3, $2));}
    | Invocation OptFuncExist Arguments
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Call($1, $3, $2));}
    | SUPER OptFuncExist Arguments
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.SuperCall(yy.addLocationDataFn(@1)(new yy.Super), $3, $2));}
    ;

OptFuncExist
    : 
        {$$ = yy.addLocationDataFn(@1, @1)(false);}
    | FUNC_EXIST
        {$$ = yy.addLocationDataFn(@1, @1)(true);}
    ;

Arguments
    : CALL_START CALL_END
        {$$ = yy.addLocationDataFn(@1, @2)([]);}
    | CALL_START ArgList OptComma CALL_END
        {$$ = yy.addLocationDataFn(@1, @4)($2);}
    ;

This
    : THIS
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value(new yy.ThisLiteral));}
    | '@'
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value(new yy.ThisLiteral));}
    ;

ThisProperty
    : '@' Property
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Value(yy.addLocationDataFn(@1)(new yy.ThisLiteral), [yy.addLocationDataFn(@2)(new yy.Access($2))], 'this'));}
    ;

Array
    : '[' ']'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Arr([]));}
    | '[' ArgList OptComma ']'
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Arr($2));}
    ;

RangeDots
    : '..'
        {$$ = yy.addLocationDataFn(@1, @1)('inclusive');}
    | '...'
        {$$ = yy.addLocationDataFn(@1, @1)('exclusive');}
    ;

Range
    : '[' Expression RangeDots Expression ']'
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Range($2, $4, $3));}
    ;

Slice
    : Expression RangeDots Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Range($1, $3, $2));}
    | Expression RangeDots
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Range($1, null, $2));}
    | RangeDots Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Range(null, $2, $1));}
    | RangeDots
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Range(null, null, $1));}
    ;

ArgList
    : Arg
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | ArgList ',' Arg
        {$$ = yy.addLocationDataFn(@1, @3)($1.concat($3));}
    | ArgList OptComma TERMINATOR Arg
        {$$ = yy.addLocationDataFn(@1, @4)($1.concat($4));}
    | INDENT ArgList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @4)($2);}
    | ArgList OptComma INDENT ArgList OptComma OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)($1.concat($4));}
    ;

Arg
    : Expression
        {$$ = $1;}
    | Splat
        {$$ = $1;}
    | '...'
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Expansion);}
    ;

SimpleArgs
    : Expression
        {$$ = $1;}
    | SimpleArgs ',' Expression
        {$$ = yy.addLocationDataFn(@1, @3)([].concat($1, $3));}
    ;

Try
    : TRY Block
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Try($2));}
    | TRY Block Catch
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Try($2, $3[0], $3[1]));}
    | TRY Block FINALLY Block
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Try($2, null, null, $4));}
    | TRY Block Catch FINALLY Block
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Try($2, $3[0], $3[1], $5));}
    ;

Catch
    : CATCH Identifier Block
        {$$ = yy.addLocationDataFn(@1, @3)([$2, $3]);}
    | CATCH Object Block
        {$$ = yy.addLocationDataFn(@1, @3)([yy.addLocationDataFn(@2)(new yy.Value($2)), $3]);}
    | CATCH Block
        {$$ = yy.addLocationDataFn(@1, @2)([null, $2]);}
    ;

Throw
    : THROW Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Throw($2));}
    ;

Parenthetical
    : '(' Body ')'
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Parens($2));}
    | '(' INDENT Body OUTDENT ')'
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Parens($3));}
    ;

WhileSource
    : WHILE Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.While($2));}
    | WHILE Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.While($2, {
          guard: $4
        }));}
    | UNTIL Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.While($2, {
          invert: true
        }));}
    | UNTIL Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.While($2, {
          invert: true,
          guard: $4
        }));}
    ;

While
    : WhileSource Block
        {$$ = yy.addLocationDataFn(@1, @2)($1.addBody($2));}
    | Statement WhileSource
        {$$ = yy.addLocationDataFn(@1, @2)($2.addBody(yy.addLocationDataFn(@1)(yy.Block.wrap([$1]))));}
    | Expression WhileSource
        {$$ = yy.addLocationDataFn(@1, @2)($2.addBody(yy.addLocationDataFn(@1)(yy.Block.wrap([$1]))));}
    | Loop
        {$$ = yy.addLocationDataFn(@1, @1)($1);}
    ;

Loop
    : LOOP Block
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.While(yy.addLocationDataFn(@1)(new yy.BooleanLiteral('true'))).addBody($2));}
    | LOOP Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.While(yy.addLocationDataFn(@1)(new yy.BooleanLiteral('true'))).addBody(yy.addLocationDataFn(@2)(yy.Block.wrap([$2]))));}
    ;

For
    : Statement ForBody
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.For($1, $2));}
    | Expression ForBody
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.For($1, $2));}
    | ForBody Block
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.For($2, $1));}
    ;

ForBody
    : FOR Range
        {$$ = yy.addLocationDataFn(@1, @2)({
          source: yy.addLocationDataFn(@2)(new yy.Value($2))
        });}
    | FOR Range BY Expression
        {$$ = yy.addLocationDataFn(@1, @4)({
          source: yy.addLocationDataFn(@2)(new yy.Value($2)),
          step: $4
        });}
    | ForStart ForSource
        {$$ = yy.addLocationDataFn(@1, @2)((function () {
        $2.own = $1.own;
        $2.ownTag = $1.ownTag;
        $2.name = $1[0];
        $2.index = $1[1];
        return $2;
      }()));}
    ;

ForStart
    : FOR ForVariables
        {$$ = yy.addLocationDataFn(@1, @2)($2);}
    | FOR OWN ForVariables
        {$$ = yy.addLocationDataFn(@1, @3)((function () {
        $3.own = true;
        $3.ownTag = yy.addLocationDataFn(@2)(new yy.Literal($2));
        return $3;
      }()));}
    ;

ForValue
    : Identifier
        {$$ = $1;}
    | ThisProperty
        {$$ = $1;}
    | Array
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    | Object
        {$$ = yy.addLocationDataFn(@1, @1)(new yy.Value($1));}
    ;

ForVariables
    : ForValue
        {$$ = yy.addLocationDataFn(@1, @1)([$1]);}
    | ForValue ',' ForValue
        {$$ = yy.addLocationDataFn(@1, @3)([$1, $3]);}
    ;

ForSource
    : FORIN Expression
        {$$ = yy.addLocationDataFn(@1, @2)({
          source: $2
        });}
    | FOROF Expression
        {$$ = yy.addLocationDataFn(@1, @2)({
          source: $2,
          object: true
        });}
    | FORIN Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @4)({
          source: $2,
          guard: $4
        });}
    | FOROF Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @4)({
          source: $2,
          guard: $4,
          object: true
        });}
    | FORIN Expression BY Expression
        {$$ = yy.addLocationDataFn(@1, @4)({
          source: $2,
          step: $4
        });}
    | FORIN Expression WHEN Expression BY Expression
        {$$ = yy.addLocationDataFn(@1, @6)({
          source: $2,
          guard: $4,
          step: $6
        });}
    | FORIN Expression BY Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @6)({
          source: $2,
          step: $4,
          guard: $6
        });}
    | FORFROM Expression
        {$$ = yy.addLocationDataFn(@1, @2)({
          source: $2,
          from: true
        });}
    | FORFROM Expression WHEN Expression
        {$$ = yy.addLocationDataFn(@1, @4)({
          source: $2,
          guard: $4,
          from: true
        });}
    ;

Switch
    : SWITCH Expression INDENT Whens OUTDENT
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Switch($2, $4));}
    | SWITCH Expression INDENT Whens ELSE Block OUTDENT
        {$$ = yy.addLocationDataFn(@1, @7)(new yy.Switch($2, $4, $6));}
    | SWITCH INDENT Whens OUTDENT
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Switch(null, $3));}
    | SWITCH INDENT Whens ELSE Block OUTDENT
        {$$ = yy.addLocationDataFn(@1, @6)(new yy.Switch(null, $3, $5));}
    ;

Whens
    : When
        {$$ = $1;}
    | Whens When
        {$$ = yy.addLocationDataFn(@1, @2)($1.concat($2));}
    ;

When
    : LEADING_WHEN SimpleArgs Block
        {$$ = yy.addLocationDataFn(@1, @3)([[$2, $3]]);}
    | LEADING_WHEN SimpleArgs Block TERMINATOR
        {$$ = yy.addLocationDataFn(@1, @4)([[$2, $3]]);}
    ;

IfBlock
    : IF Expression Block
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.If($2, $3, {
          type: $1
        }));}
    | IfBlock ELSE IF Expression Block
        {$$ = yy.addLocationDataFn(@1, @5)($1.addElse(yy.addLocationDataFn(@3, @5)(new yy.If($4, $5, {
          type: $3
        }))));}
    ;

If
    : IfBlock
        {$$ = $1;}
    | IfBlock ELSE Block
        {$$ = yy.addLocationDataFn(@1, @3)($1.addElse($3));}
    | Statement POST_IF Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.If($3, yy.addLocationDataFn(@1)(yy.Block.wrap([$1])), {
          type: $2,
          statement: true
        }));}
    | Expression POST_IF Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.If($3, yy.addLocationDataFn(@1)(yy.Block.wrap([$1])), {
          type: $2,
          statement: true
        }));}
    ;

Operation
    : UNARY Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
    | UNARY_MATH Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
    | '-' Expression %prec UNARY_MATH
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('-', $2));}
    | '+' Expression %prec UNARY_MATH
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('+', $2));}
    | AWAIT Expression
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op($1, $2));}
    | '--' SimpleAssignable
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('--', $2));}
    | '++' SimpleAssignable
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('++', $2));}
    | SimpleAssignable '--'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('--', $1, null, true));}
    | SimpleAssignable '++'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Op('++', $1, null, true));}
    | Expression '?'
        {$$ = yy.addLocationDataFn(@1, @2)(new yy.Existence($1));}
    | Expression '+' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op('+', $1, $3));}
    | Expression '-' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op('-', $1, $3));}
    | Expression MATH Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '**' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression SHIFT Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression COMPARE Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '&' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '^' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '|' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '&&' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression '||' Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression BIN? Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Op($2, $1, $3));}
    | Expression RELATION Expression
        {$$ = yy.addLocationDataFn(@1, @3)((function () {
        if ($2.charAt(0) === '!') {
          return new yy.Op($2.slice(1), $1, $3).invert();
        } else {
          return new yy.Op($2, $1, $3);
        }
      }()));}
    | SimpleAssignable COMPOUND_ASSIGN Expression
        {$$ = yy.addLocationDataFn(@1, @3)(new yy.Assign($1, $3, $2));}
    | SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT
        {$$ = yy.addLocationDataFn(@1, @5)(new yy.Assign($1, $4, $2));}
    | SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression
        {$$ = yy.addLocationDataFn(@1, @4)(new yy.Assign($1, $4, $2));}
    ;

Github pages yields 404

I'm not sure what is going wrong but github shows me 404 for the page of the app, had something working there now it's gone I guess.

Uncaught Error: Invariant Violation

Seeing this intermittent error:

Uncaught Error: Invariant Violation: replaceState(...): Can only update a mounted or mounting component.
  invariant.js:42 invariantReactCompositeComponent.js:449 
  validateLifeCycleOnReplaceStateReactCompositeComponent.js:893 
  ReactCompositeComponentMixin.replaceStateReactCompositeComponent.js:874 
  ReactCompositeComponentMixin.setStateLexErrorView.js:24 
  React.createClass._onChangeevents.js:99 EventEmitter.emitGrammarStore.js:23 
  assign.emitChangeGrammarStore.js:81 (anonymous function)Dispatcher.js:220 
  Dispatcher.$Dispatcher_invokeCallbackDispatcher.js:195 Dispatcher.dispatchdispatcher.js:22 
  assign.handleWorkerActionParsedTextActionCreator.js:8 module.exports.textParsedParserWorkerService.js:19 (anonymous function)

I know what some of those words mean...

Feature request: Test grammar rules only

@nolanlawson May I ask you to add a checkbox to check only grammar rules without JavaScript internal code. For example:

Source grammar:

    DeclaresList
    : DeclareItem
        { $$ = [$1]; }
    | DeclaresList COMMA DeclareItem
        { $1.push($3); $$ = $1; }
    ;

Debugging grammar:

     DeclaresList
    : DeclareItem
    | DeclaresList COMMA DeclareItem
    ;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.