下面的语法无法生成出现此错误的解析器:
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
;