gpt4 book ai didi

c# - TinyPG 没有正确解析这个语法,bug 还是错误的语法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:38 24 4
gpt4 key购买 nike

我需要解析一个不是我设计的简单语言,所以我不能改变语言。我需要 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 关键字。

所以,这是我的问题:

  1. 对于 LL(1) 解析,此语法是否有歧义或错误?或者这是 TinyPG 中的错误?

  2. 是否有任何方法可以重新设计语法,使 TinyPG 能够正确解析示例行?

  3. 是否有任何其他关于在 C# 中输出代码并且不需要额外库的简单解析器的建议?我看过 LLLPGANTLR4,但发现它们比 TinyPG 麻烦得多。

最佳答案

你可能是同一个人,因为这个问题看起来和我在 GitHub 上回答的一样,但这里又是为谷歌这个问题的人准备的。

这是来自 Simple-CIL-compiler 项目的示例,标识符必须捕获除列出的单词之外的单个单词,这意味着您必须将异常标记包含在标识符中

IDENTIFIER-> @"[a-zA-Z_][a-zA-Z0-9_]*(?<!(^)(end|else|do|while|for|true|false|return|to|incby|global|or|and|not|write|readnum|readstr|call))(?!\w)";

希望对您有所帮助。

(Link to Original post)

关于c# - TinyPG 没有正确解析这个语法,bug 还是错误的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30391393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com