为词法分析器添加模式时出现 Antlr 错误

Antlr Error when adding a Mode for Lexers

我是第一次尝试 Lexing 模式。 我有一个词法分析器语法,其中有一种模式正在导入到我的 "main" 语法中。 为语法分析器

生成 java 类 时出现此错误

'rule DESCRIPTION_FIELD contains a lexer command with an unrecognized constant value; lexer interpreters may produce incorrect output'

我关注了这个article 我的 Lexer 语法如下:

lexer grammar TestLexerGrammar;

DESCRIPTION_FIELD
:
    'DESCRIPTION:'-> pushMode(FREETEXTMODE)
;


mode FREETEXTMODE;

FREE_TEXT_FIELD_FORMAT
:
    STR+
;

fragment
STR
:
    (
        LETTER
        | DIGIT
    )
;

我的主要语法:

grammar Grammar;
import TestLexerGrammar;


descriptionElement
:
    DESCRIPTION_FIELD freeTextFields
;

freeTextFields
:
    FREE_TEXT_FIELD_FORMAT+
;

因此在生成的 GrammarLexer.java 中出现错误:“FREETEXTMODE 无法解析为变量”

这是错误的做法吗?是否有可能通过解析规则触发更改模式?

您不能在带有 import 语句的语法中使用模式。 github 上有相关问题:Problems with lexical modes inside an imported grammar and No error/incorrect code generation when importing lexer grammar with modes into a combined grammar

因此,您应该通过以下方式修复您的主要语法并删除 import 语句:

parser grammar Grammar;
options { tokenVocab=TestLexerGrammar; }