Antlr 为什么';Lexer.cs不能识别词法模式吗?

Antlr 为什么';Lexer.cs不能识别词法模式吗?,antlr,antlr4,Antlr,Antlr4,我在这个站点以及其他地方看到了很多词汇模式的实现示例,比如ANTLR4的权威指南。在用词法模式编写自己的词法语法之前,我只想尝试一个例子。因此,我复制了以下示例: 并将其导入一个非常简单的解析器语法: grammar Example1; import MarkupLexer; any : .*; 我只想看看它是否能成功构建。但是,我遇到了相同的错误:名称“BBCODE”在当前上下文中不存在,错误发生在此自动生成的方法中: private void OPEN_a

我在这个站点以及其他地方看到了很多词汇模式的实现示例,比如ANTLR4的权威指南。在用词法模式编写自己的词法语法之前,我只想尝试一个例子。因此,我复制了以下示例:

并将其导入一个非常简单的解析器语法:

grammar Example1;
import MarkupLexer;

any                 : .*;
我只想看看它是否能成功构建。但是,我遇到了相同的错误:
名称“BBCODE”在当前上下文中不存在
,错误发生在此自动生成的方法中:

private void OPEN_action(RuleContext _localctz, int actionIndex) {
    switch (actionIndex) {
    case 0: PushMode(BBCODE); break;
    }
}
我注意到自动生成的Lexer中的
modeNames
数组只包含
“DEFAULT\u MODE”


我错过了什么?为什么不生成此版本?

问题在于,当您应该使用“选项{tokenVocab=MarkupLexer;}”时,您正在使用“导入”。你的语法应该是:

MarkupParser.g4:

parser grammar MarkupParser;

options {
    tokenVocab = MarkupLexer ;
}

any                 : .*;
MarkupLexer.g4:


问题是,当您应该使用“options{tokenVocab=MarkupLexer;}”时,您正在使用“import”。你的语法应该是:

MarkupParser.g4:

parser grammar MarkupParser;

options {
    tokenVocab = MarkupLexer ;
}

any                 : .*;
MarkupLexer.g4:

lexer grammar MarkupLexer;
OPEN                : '[' -> pushMode(BBCODE) ;
TEXT                : ~('[')+ ;
// Parsing content inside tags
mode BBCODE;
CLOSE               : ']' -> popMode ;
SLASH               : '/' ;
EQUALS              : '=' ;
STRING              : '"' .*? '"' ;
ID                  : LETTERS+ ;
WS                  : [ \t\r\n] -> skip ;
fragment LETTERS    : [a-zA-Z] ;