Import 尝试以多种模式导入lexer语法时出现java错误

Import 尝试以多种模式导入lexer语法时出现java错误,import,mode,antlr4,lexer,Import,Mode,Antlr4,Lexer,我试图弄清楚如何在语法中使用模式,但我对如何将具有不同模式的lexer语法导入组合语法感到困惑。希望这是件简单的事,但我想不出来 基本上,我试图创建一个语法来识别一个regexp字符串——一个以任何非空白字符开头,然后以换行符结尾的字符串。通过查看antlr4书中的模式使用方法,我提出了以下lexer语法: lexer grammar hlex; REG : REGLIMIT -> more, mode(REG_MODE) ; REGLIMIT : [ ]* ~[ \t\r\n] ;

我试图弄清楚如何在语法中使用模式,但我对如何将具有不同模式的lexer语法导入组合语法感到困惑。希望这是件简单的事,但我想不出来

基本上,我试图创建一个语法来识别一个regexp字符串——一个以任何非空白字符开头,然后以换行符结尾的字符串。通过查看antlr4书中的模式使用方法,我提出了以下lexer语法:

lexer grammar hlex;

REG : REGLIMIT -> more, mode(REG_MODE) ;
REGLIMIT : [ ]* ~[ \t\r\n] ;

mode REG_MODE ;

REGEND : [ ]+'\r'? '\n' ->mode(DEFAULT_MODE) ;
TEXT : . -> more ;
现在我想把它导入一个组合语法。我使用以下组合语法:(前缀是每行都需要开头的东西,但不是regexp的一部分)

这就是我的问题开始的地方

我运行:

java -classpath ./antlr-4.1-complete.jar org.antlr.v4.Tool h.g4
上面说:

warning(125): h.g4:5:18: implicit definition of token 'REG' in parser
这让我感到困惑——REG是在导入中定义的——那么为什么ANTLR必须创建一个隐式定义呢

当我试图编译*.java时,它说:

hLexer.java:75: error: cannot find symbol
                case 1: more(); _mode = REG_MODE;  break;
                                        ^
  symbol:   variable REG_MODE
  location: class hLexer
我不确定我错过了什么。这可能很简单,但我想不出来

还有另一个堆栈溢出问题:这表明多模式lexer语法导入没有得到正确处理

但在这种情况下,我对如何使用多种模式感到困惑——我试图将lexer拆分为两个语法文件:

文件hlex1.g4:

lexer grammar hlex1;
import hlex2 ;
REG : REGLIMIT -> more, mode(REG_MODE) ;
REGLIMIT : [ ]* ~[ \t\r\n] ;
和文件hlex2.g4

lexer grammar hlex2 ;
mode REG_MODE ;

REGEND : [ ]+'\r'? '\n' ->mode(DEFAULT_MODE) ;
TEXT : . -> more ;
但antlr4在hlex2.g4上抱怨说,它对意外的“模式”感到惊讶


所以我被难住了。你知道我错过了什么吗?

回答我自己-自鸣得意

阅读xml语法示例使我能够超越导入问题。事实证明,我不能像前面的堆栈溢出回答中提到的那样,将具有多种模式的lexer语法导入到组合解析器中-我需要将我的其他语法标记为解析器语法,而不是使用import,我必须说

options { tokenVocab=hlex }

还有一些东西我不明白-比如如果我有一个引用其他LEXER规则的LEXER规则,我似乎无法在解析器文件中引用它,但其他规则是可以访问的

好的,我的语法是错误的,但也只是为了子孙后代,一些lexer规则对语法不可见的原因是因为我使用了“more”关键字。具有“more”操作的lexer规则对解析器不可见,因为它的唯一功能是收集输入。
options { tokenVocab=hlex }