我正在试图弄清楚如何在我的语法中使用模式,并且我对如何将具有不同模式的词法分析器语法导入组合语法感到困惑。希望这很简单,但我无法理解。
基本上我正在尝试创建一个识别正则表达式字符串的语法 - 所以一个字符串以任何非空格字符开头,然后以换行符结束。看看如何在antlr4书中使用模式,我想出了这个词法分析器语法:
lexer grammar hlex;
REG : REGLIMIT -> more, mode(REG_MODE) ;
REGLIMIT : [ ]* ~[ \t\r\n] ;
mode REG_MODE ;
REGEND : [ ]+'\r'? '\n' ->mode(DEFAULT_MODE) ;
TEXT : . -> more ;
现在我想把它导入一个组合语法。我使用以下组合语法:(前缀填充是每行需要开始但不是正则表达式的一部分)。
grammar h;
import hlex ;
value : op=PREFIX REG ;
PREFIX : 'P:'
| 'DW:' ;
WS : [ \t\r\n]+ -> skip ;
这是我的问题开始的地方。
我跑:
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 modes from imported grammar is not identified in combined grammar. Compilation error after clicking 'run in testRig' Antlrworks2表示多模式词法分析器语法导入未正确处理。
但在那种情况下,我对如何使用多种模式感到困惑 - 我试图将词法分析器分成2个语法文件:
文件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上抱怨说它对意外的“模式”感到惊讶。
所以我很难过。我缺少什么想法?
答案 0 :(得分:2)
回答自己 - 自己高五!
阅读xml语法示例让我超越了导入问题。事实证明我无法将具有多种模式的词法分析器语法导入到组合解析器中,因为之前的堆栈溢出答案已经提到过 - 我需要将我的其他语法标记为解析器语法而不是使用import,我不得不说
options { tokenVocab=hlex }
还有一些我不理解的东西 - 比如如果我有一个引用其他词法规则的LEXER规则,我似乎无法在解析器文件中引用它,但其他规则是可访问的。