Файл ANTLR4 для идентификации выражений калькулятора - PullRequest
0 голосов
/ 23 февраля 2020

Я скопировал образец сценария правил лексера и синтаксического анализатора из примеров ANTLR4 и пробовал локально. Файл соответствует правилам калькулятора для определения математических выражений. Но это приводит к появлению следующей ошибки, которую я не могу устранить, если полностью не удалить левые рекурсивные правила для 'expr'. Правила:

    grammar Expr;

/** The start rule; begin parsing here. */
prog:   stat+ ; 

stat:   expr NEWLINE                
    |   ID '=' expr NEWLINE        
    |   NEWLINE                   
    ;

expr:   expr ('*'|'/') expr   
    |   expr ('+'|'-') expr   
    |   INT                    
    |   ID                    
    |   '(' expr ')'         
    ;

ID  :   [a-zA-Z]+ ;      // match identifiers 
INT :   [0-9]+ ;         // match integers
NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)
WS  :   [ \t]+ -> skip ; // toss out whitespace

Произошла ошибка приведена ниже:

    $ antlr4 Expr.g4
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at org.antlr.v4.misc.OrderedHashMap.getElement(OrderedHashMap.java:46)
    at org.antlr.v4.analysis.LeftRecursiveRuleTransformer.setAltASTPointers(LeftRecursiveRuleTransformer.java:241)
    at org.antlr.v4.analysis.LeftRecursiveRuleTransformer.translateLeftRecursiveRule(LeftRecursiveRuleTransformer.java:162)
    at org.antlr.v4.analysis.LeftRecursiveRuleTransformer.translateLeftRecursiveRules(LeftRecursiveRuleTransformer.java:89)
    at org.antlr.v4.semantics.SemanticPipeline.process(SemanticPipeline.java:94)
    at org.antlr.v4.Tool.processNonCombinedGrammar(Tool.java:399)
    at org.antlr.v4.Tool.process(Tool.java:384)
    at org.antlr.v4.Tool.processGrammarsOnCommandLine(Tool.java:343)
    at org.antlr.v4.Tool.main(Tool.java:190)

1 Ответ

0 голосов
/ 23 февраля 2020

Проблема исправлена. Был поднят из-за несовместимости antlr4 на данный момент с Java 8. Использование java 7 исправило это. Спасибо

...