我需要解析一种不是我设计的简单语言,所以我无法更改语言。我需要 C# 中的结果,所以我一直在使用TinyPG,因为它非常易于使用,并且不需要外部库来运行解析器。
事情一直进展顺利,直到我在语言中遇到了这个结构。(这是一个简化版本,但确实显示了问题):
EOF -> @"^\s*$";
[Skip] WHITESPACE -> @"\s+";
LIST -> "LIST";
END -> "END";
IDENTIFIER -> @"[a-zA-Z_][a-zA-Z0-9_]*";
Expr -> LIST IDENTIFIER+ END;
Start -> (Expr)+ EOF;
结果解析器无法解析:
LIST foo BAR Baz END
因为它贪婪地将 END 作为一个IDENTIFIER
, 而不是正确地作为END
关键字。
所以,这是我的问题:
对于 LL(1) 解析,此语法是否模棱两可或错误?或者这是 TinyPG 中的错误?
有什么方法可以重新设计语法以
TinyPG
正确解析示例行?C#
对于输出代码且不需要额外库的简单解析器,还有其他建议吗?我看过LLLPG
andANTLR4
,但发现它们比TinyPG
.