我遇到输入不匹配的ANTLR4问题但无法解决问题。我发现了许多与此有关的问题,通常围绕词法分析器匹配其他东西与令牌,但我不会在我的情况下看到它。
我有这个lexer语法:
FieldStart : '[' Definition ']' -> pushMode(INFIELD) ;
Definition : 'Element';
mode INFIELD;
FieldEnd : '[end]' -> popMode ;
ContentValue : ~[[]* ;
然后在以下解析器上运行:
field : FieldStart ContentValue FieldEnd #Field_Found;
我简化了它以放大问题,但这是我无法再进一步的地方。
我在以下输入上运行它:
[Element]Va-lu*e[end]
我得到了这个输出:
Type : 001 | FieldStart | [Element]
Type : 004 | ContentValue | Va-lu*e
Type : 003 | FieldEnd | [end]
Type : -001 | EOF | <EOF>
([] [Element] Va-lu*e [end])
我使用C#生成输出,执行以下操作(缩短):
string tokens = "";
foreach (IToken CurrToken in TokenStream.GetTokens())
{
if (CurrToken.Type == -1)
{
tokens += "Type : " + CurrToken.Type.ToString("000") + " | " + "EOF" + " | " + CurrToken.Text + "\n";
}
else
{
tokens += "Type : " + CurrToken.Type.ToString("000") + " | " + Lexer.RuleNames[CurrToken.Type - 1] + " | " + CurrToken.Text + "\n";
}
}
tokens += "\n\n" + ParseTree.ToStringTree();
通过
进行解析IParseTree ParseTree = Parser.field();
我遇到了这个错误:
"mismatched input 'Va-lu*e' expecting ContentValue"
我只是找不到错误,你能在这帮我吗? 我认为它与词法分析器模式有关,但据我所知,解析器看起来并不关心(或知道)模式。
谢谢!
答案 0 :(得分:1)
模式在组合语法中不可用。拆分你的语法,它应该工作。
另外,请务必查看错误消息:
错误(120):../ Field.g4:14:5:lexical模式只允许在词法分析器语法中
答案 1 :(得分:0)
我想我现在已经想出如何解决我的问题,在使用拆分的Lexer / Parser语法结构并使用Visual Studio(2012和2013测试)中的Lexer模式和ANTRL4 NuGet时,似乎需要配置释放:
我必须包括
options { tokenVocab = GRAMMAR_NAME_Lexer; }
&#13;
在开头的解析器语法中。
否则,词法分析器会按预期创建标记和模式,但解析器将无法识别处于其他模式但默认模式的词法分析器标记。
我也经历过&#34; popMode&#34; lexer命令有时会导致我的TokenStream抛出无效状态异常,我可以使用&#34;模式(DEFAULT_MODE)&#34;来解决这个问题。而不是&#34; popMode&#34;。
我希望这对某些人有所帮助,但我仍然喜欢,如果了解ANTLR的人可以提供一些额外的澄清,因为我只是解决了#34;通过玩弄它直到它起作用。