如何为java / jsf代码创建自己的解析器?

时间:2009-03-23 17:45:16

标签: java parsing

您好我想制作自己的'解析器',例如:计算(4+(3-4 ^ 2))* 2或 解析java,jsf,html代码。

事实上我做了类似的事情,但我觉得这不好。

对我有什么好处吗?我试过阅读更多,但我有点困惑,LL,LR,AST,BNF,javacc yacc等:)。当我想计算4 + ...

时,我不知道该走哪条路

或者如果我想解析java,jsf代码并从中生成一些东西(另一个java代码)

有什么特别好的东西像ast一样吗?或者我可以用于两者的东西?

谢谢你的帮助。

8 个答案:

答案 0 :(得分:2)

在其他任何事情之前,您必须了解解析的所有内容都基于语法

语法描述了你想要实现的语言,如何在基本单元中分解文本以及如何以某种方式堆叠这些单元。您可能还想查找令牌非终端终端概念。

LL和LR之间的差异可以有两种:实现差异和语法写作差异。如果您使用标准工具,则只需要了解第二部分。

我通常使用LL(自上而下)语法。即使使用自定义代码,它们也更易于编写和实现。 LR语法理论上涵盖了更多种类的语言,但在正常情况下,当您需要一些正确的错误检测时,它们只是一个障碍。

一些随机指针:

  • javacc (java,LL),
  • antlr (java,LL),
  • yepp (smarteiffel,LL),
  • 野牛(C,LR,古老的 yacc 的GNU版本)

答案 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)

使用生成Lexers和Parsers的工具通常比从头编写自己的工具容易得多。

除了已列出的内容之外,您还可以使用JLexCUP之类的内容为算术表达式之类的内容创建一个简单的解释器。