我试图弄清楚如何在我的语法中使用模式,但我对如何将具有不同模式的词法分析器语法导入到组合语法中感到困惑。希望是简单的东西,但我想不出来。
基本上,我尝试创建一种可以识别regexp字符串的语法-即以任何非空格字符开头,然后以换行符结尾的字符串。看看如何在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 ;
现在我想把它导入到一个组合语法中。我使用以下组合语法:(前缀内容是每行都需要开始的东西,但不是regexp的一部分)。
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,它表明多模式词法分析器语法导入没有被正确处理。
但在这种情况下,我对如何使用多种模式感到困惑--我试图将词法分析器分成两个语法文件:
文件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上抱怨说它对意想不到的“模式”感到惊讶。
所以我被难住了。知道我错过了什么吗?
发布于 2014-01-10 22:16:19
回答我自己--自我击掌!
通过阅读xml语法示例,我可以解决导入问题。事实证明,我不能像前面的堆栈溢出答案所提到的那样,将具有多种模式的词法分析器语法导入到组合解析器中-我需要将另一个语法标记为解析器语法,而不是使用import,我必须这样说
options { tokenVocab=hlex }
仍然有一些东西我不理解-比如,如果我有一个引用其他词法分析器规则的词法分析器规则,我似乎无法在解析器文件中引用它,但其他规则是可以访问的。
https://stackoverflow.com/questions/21042091
复制