a strange parse result for javascript.g4

54 views
Skip to first unread message

Z ZZ

unread,
Nov 5, 2019, 10:30:28 PM11/5/19
to antlr-discussion

```
iterationStatement
    : Do statement While '(' expressionSequence ')' eos                                                         # DoStatement
    | While '(' expressionSequence ')' statement                                                                # WhileStatement
    | For '(' expressionSequence? ';' expressionSequence? ';' expressionSequence? ')' statement                 # ForStatement
    | For '(' varModifier variableDeclarationList ';' expressionSequence? ';' expressionSequence? ')'
          statement                                                                                             # ForVarStatement
    | For '(' singleExpression (In | Identifier{this.p("of")}?) expressionSequence ')' statement                # ForInStatement
    | For '(' varModifier variableDeclaration (In | Identifier{this.p("of")}?) expressionSequence ')' statement # ForVarInStatement
    ;
```
I use the IDEA antlr4 plugin for test rules , it is ok!

001.png

But when I generate the parsetree ,it throws a error ! 
In fact, there should be no errors here.
```
        ANTLRFileStream afis = new ANTLRFileStream("demo.js");
        JavaScriptLexer lexer = new JavaScriptLexer(afis);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        JavaScriptParser parser = new JavaScriptParser(tokens);
        ParseTree tree= parser.program();
        System.out.println(tree.toStringTree(parser));
```
console.out
```
line 1:11 rule iterationStatement failed predicate: {this.p("of")}?
line 1:15 no viable alternative at input ')'
(program (sourceElements (sourceElement (statement (iterationStatement for ( (singleExpression let) dd in))) (sourceElement (statement (expressionStatement (expressionSequence (singleExpression o)) (eos ))))) (sourceElement (statement (block { (statementList (statement (expressionStatement (expressionSequence (singleExpression (singleExpression o) [ (expressionSequence (singleExpression i)) ])) (eos ;)))) })))) <EOF>)
2
```

eric vergnaud

unread,
Nov 10, 2019, 2:17:36 AM11/10/19
to antlr-di...@googlegroups.com
ANTLR provides no guarantee that the 'this' in JavaScript will refer to the equivalent 'this' in Java (not speaking of Python and other targets)
suggest you inherit an abstract parser instead


Z ZZ

unread,
Nov 14, 2019, 5:57:04 AM11/14/19
to antlr-discussion
Thanks,I resolved it yesterday.

在 2019年11月10日星期日 UTC+8下午3:17:36,eric vergnaud写道:
Reply all
Reply to author
Forward
0 new messages