我正在尝试使用Irony-Language Implementation Kit编写语言解析器,但是遇到了问题。
我正在遵循一种现有的BNF语言。在某些情况下,需要特定的语法,即一串特定字符。我试图创建一个可以接受任意数量的这些字符的规则,并且由于当前超出我的理解范围的某些原因,Irony无法解析(或扫描?)提供的字符串。
我试图尽可能简化以找出我在做什么错,并且碰壁了我无法理解反讽在做什么/为什么它无法解析我的输入的原因。这是解析器失败的一种简化情况。
public class TestGrammar : Grammar
{
public NonTerminal filter = new NonTerminal("filter");
public NonTerminal values = new NonTerminal("values");
public NonTerminal value = new NonTerminal("value");
public TestGrammar() : base(true)
{
filter.Rule = values;
MakeStarRule(values, Empty, value);
value.Rule = ToTerm("$") | "a" | "b";
Root = filter;
}
}
我通过解析器针对上述语法运行了几个测试字符串,结果如下:
a
-成功b
-成功$
-成功aa
-失败 ab
-失败 a$
-成功aaa
-失败 aab
-失败 $a
-成功$$$
-成功$a$a$a$
-成功$$a$$a$
-成功$$aa$a$
-失败 引起这种情况的字母字符是什么?
我尝试用其他字母字符替换a
和/或b
并得到相同的错误。
我尝试用数字替换a
和/或b
,问题消失了。
我尝试将a
和/或b
替换为@
,这也没有问题。
我的结论是,艾尼(Irony)以某种方式将拉丁字母字符视为特殊字符,这导致解析不对具有多个连续单个拉丁字母字符的任何字符串进行解析。
我对它如何工作不了解?
我在做什么错了?