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