带有@init 块的 ANTLR4 词法分析器规则

Adr*_*ian 5 antlr4

我在我的 ANTLR v3 语法文件中定义了这个词法分析器规则 - 它用双引号对文本进行数学运算。我需要将其转换为 ANTLR v4。ANTLR 编译器抛出错误“语法错误:匹配词法规则时不匹配的输入‘@’期望 COLON”(在 @init 行中)。词法分析器规则可以包含 @init 块吗?这应该怎么改写?

DOUBLE_QUOTED_CHARACTERS
@init 
{
   int doubleQuoteMark = input.mark(); 
   int semiColonPos = -1;
}
: ('"' WS* '"') => '"' WS* '"' { $channel = HIDDEN; }
{
    RecognitionException re = new RecognitionException("Illegal empty quotes\"\"!", input);
    reportError(re);
}
| '"' (options {greedy=false;}: ~('"'))+ 
  ('"'|';' { semiColonPos = input.index(); } ('\u0020'|'\t')* ('\n'|'\r'))
{ 
    if (semiColonPos >= 0)
    {
        input.rewind(doubleQuoteMark);

        RecognitionException re = new RecognitionException("Missing closing double quote!", input);
        reportError(re);
        input.consume();            
    }
    else
    {
        setText(getText().substring(1, getText().length()-1));
    }
}
; 
Run Code Online (Sandbox Code Playgroud)

样本数据:

  1. " " -> 抛出错误“非法的空引号!”;
  2. “asd -> 抛出错误“缺少结束双引号!”
  3. “text” -> 返回文本(有效输入,“...”的内容)

Ros*_*ood -1

当我的 .g4 语法导入词法分析器文件时,我解决了这个问题。导入语法文件似乎会引发 ANTLR4 中许多未记录的缺陷。所以最终我不得不停止使用导入。就我而言,一旦我将 LEXER 语法合并到解析器语法(一个 .g4 文件)中,我的 @input 和 @after 解析错误就消失了。我应该提交一个测试用例+错误,至少要记录下来。一旦我这样做了,我会在这里更新。我依稀记得将词法分析器语法导入解析器时出现了 2-3 个问题,这些问题触发了未记录的行为。stackoverflow 上介绍了很多内容。