antlr4:导致'左递归错误'的动作

时间:2017-09-25 20:03:58

标签: parsing whitespace antlr4 left-recursion

下面的语法无法生成出现此错误的解析器:

error(119): Sable.g4::: The following sets of rules are mutually left-recursive [expression]
1 error(s)

当我注释掉嵌入的动作时,错误消失,但是当我使它们生效时,错误就会消失。

为什么antlr4无法处理这种左递归的动作?

grammar Sable;

options {}

@header {
    package org.sable.parser;
    import org.sable.parser.internal.*;
}

sourceFile              : statement* EOF;
statement               : expressionStatement (SEMICOLON | NEWLINE);
expressionStatement     : expression;

expression:
    {System.out.println("w");} expression '+' expression {System.out.println("tf?");}
    | IDENTIFIER
    ;

SEMICOLON               : ';';
RPARENTH                : '(';
LPARENTH                : ')';
NEWLINE:
    ('\u000D' '\u000A')
    | '\u000A'
    ;
WS                      : WhiteSpaceNotNewline -> channel(HIDDEN);
IDENTIFIER:
    (IdentifierHead IdentifierCharacter*)
    | ('`'(IdentifierHead IdentifierCharacter*)'`')
    ;

fragment DecimalDigit   :'0'..'9';

fragment IdentifierHead:
    'a'..'z'
    | 'A'..'Z'
    ;
fragment IdentifierCharacter:
    DecimalDigit
    | IdentifierHead
    ;
// Non-newline whitespaces are defined apart because they carry meaning in
// certain contexts, e.g. within space-aware operators.
fragment WhiteSpaceNotNewline    : [\u0020\u000C\u0009u000B\u000C];

更新:以下解决方法类型解决了这种特定情况,但不适用于较小范围内需要执行init / after-like操作的情况 - 每个选项,而不是每个规则。

expression
    @init {
        enable(Token.HIDDEN_CHANNEL);
    }
    @after {
        disable(Token.HIDDEN_CHANNEL);  
    }:
    expression '+' expression
    | IDENTIFIER
    ;

0 个答案:

没有答案