您好我想制作自己的'解析器',例如:计算(4+(3-4 ^ 2))* 2或 解析java,jsf,html代码。
事实上我做了类似的事情,但我觉得这不好。
对我有什么好处吗?我试过阅读更多,但我有点困惑,LL,LR,AST,BNF,javacc yacc等:)。当我想计算4 + ...
时,我不知道该走哪条路或者如果我想解析java,jsf代码并从中生成一些东西(另一个java代码)
有什么特别好的东西像ast一样吗?或者我可以用于两者的东西?
谢谢你的帮助。
答案 0 :(得分:2)
在其他任何事情之前,您必须了解解析的所有内容都基于语法。
语法描述了你想要实现的语言,如何在基本单元中分解文本以及如何以某种方式堆叠这些单元。您可能还想查找令牌,非终端,终端概念。
LL和LR之间的差异可以有两种:实现差异和语法写作差异。如果您使用标准工具,则只需要了解第二部分。
我通常使用LL(自上而下)语法。即使使用自定义代码,它们也更易于编写和实现。 LR语法理论上涵盖了更多种类的语言,但在正常情况下,当您需要一些正确的错误检测时,它们只是一个障碍。
一些随机指针:
答案 1 :(得分:1)
解析可能非常激烈。标准工具是用于语法的bison或yacc,以及用于语法的flex。这些都是用C或C ++输出的代码。
答案 2 :(得分:1)
ANTLR可能是java的方法。这有点激烈,这本书显然非常好(我只是在网络文档中苦苦挣扎)。
如果你可以伸展到其他语言,那么lex / yacc(或flex / bison)是C的标准,虽然我不会特别推荐这些组合中的任何一种(陡峭的学习曲线,现在显示它们的年龄)。
Python有大约一百万个可用的解析器(SimpleParse,Yapps)或者有RubyT的TreeTop - 开发人员甚至有一个演示,可以像你的问题那样进行简单的计算 - 但请注意,这不会做LALR解析器的所有操作可以完成。
答案 3 :(得分:1)
ANTLR,但请务必阅读The Definitive ANTLR Reference,它将引导您完成解析器的创建。 ANTLR执行自上而下的LL解析器,因此本书不涉及LALR和其他类型。
JavaCC,Yacc,SableCC是更传统的词法分析器/解析器生成器,你会发现它们更原始,学习曲线更陡峭。 ANTLR同样强大,但您不必一次学习它。维基百科提供全面的comparison of parser generators。
BNF是用于指定语法的语法; ANTLR使用它自己,我发现它更美观,但其他人经常没有。
答案 4 :(得分:1)
如果是学习练习,请尝试从自上而下的解析器开始 - 它们易于编写,不需要包含/学习任何其他工具。研究基础知识的最佳地点可能是维基百科或代码项目。
答案 5 :(得分:0)
您可能想查看http://antlr.org/。它将输出java代码。如果我记得,他们的一个样本就是你想要的。
答案 6 :(得分:0)
您可能想查看Building Parsers With Java by Steven John Metsker。这本书似乎涵盖了你想要做的事情。
答案 7 :(得分:0)