Parsing 写正确的LL(1)语法?

Parsing 写正确的LL(1)语法?,parsing,grammar,recursive-descent,ll,Parsing,Grammar,Recursive Descent,Ll,我目前正试图为一种编程语言编写一个(非常)小的解释器/编译器。我已经为该语言设置了语法,现在我需要写下该语言的语法。我打算使用LL(1)解析器,因为经过一点研究,它似乎是最容易使用的 我是这个领域的新手,但从我收集的资料来看,强烈建议使用BNF或EBNF将语法形式化。然而,似乎并非所有语法都适合使用LL(1)解析器实现。因此,我想知道以LL(1)形式编写语法的正确(或推荐)方法是什么 谢谢你的帮助, 查理 PS:我打算使用Haskell的Parsec库编写解析器 编辑:另外,根据SK逻辑,Par

我目前正试图为一种编程语言编写一个(非常)小的解释器/编译器。我已经为该语言设置了语法,现在我需要写下该语言的语法。我打算使用LL(1)解析器,因为经过一点研究,它似乎是最容易使用的

我是这个领域的新手,但从我收集的资料来看,强烈建议使用BNF或EBNF将语法形式化。然而,似乎并非所有语法都适合使用LL(1)解析器实现。因此,我想知道以LL(1)形式编写语法的正确(或推荐)方法是什么

谢谢你的帮助, 查理

PS:我打算使用Haskell的Parsec库编写解析器


编辑:另外,根据SK逻辑,Parsec可以处理无限超前(LL(k)?——但我想这个问题仍然代表这种语法。

我不是这方面的专家,因为我只使用LR(0)解析器做了一个类似的小项目。我建议的一般做法是:

  • 让算术工作起来。这样,为
    +,-,/,*
    等创建规则和派生,并确保解析器生成一个工作的抽象语法树。在不同的输入上测试和评估树,以确保它正确执行算法。 循序渐进。如果您遇到任何冲突,请在继续之前先解决它

  • 让simper构造像
    if-then-else
    case
    表达式一样工作

  • 更进一步取决于你写语法的语言

  • 明确地查看其他编程语言语法作为参考(不幸的是,我没有在1分钟内在线找到任何语言的完整LL语法,但LR语法也应该作为参考有用)。例如:

    当然,维基百科上也有一些关于LL语法的小例子,你可能已经查过了


    我希望您能发现其中一些有用的东西

    我不是这方面的专家,因为我只是用LR(0)解析器做了一个类似的小项目。我建议的一般做法是:

  • 让算术工作起来。这样,为
    +,-,/,*
    等创建规则和派生,并确保解析器生成一个工作的抽象语法树。在不同的输入上测试和评估树,以确保它正确执行算法。 循序渐进。如果您遇到任何冲突,请在继续之前先解决它

  • 让simper构造像
    if-then-else
    case
    表达式一样工作

  • 更进一步取决于你写语法的语言

  • 明确地查看其他编程语言语法作为参考(不幸的是,我没有在1分钟内在线找到任何语言的完整LL语法,但LR语法也应该作为参考有用)。例如:

    当然,维基百科上也有一些关于LL语法的小例子,你可能已经查过了


    我希望你能找到一些有用的东西

    有两种算法可以确定语法是否为LL(k)。解析器生成器实现它们。如果可能的话,还有一些将语法转换为LL(k)的启发式方法

    但是您不需要将简单语言限制为LL(1),因为大多数现代解析器生成器(、和其他)都可以处理LL(k)中的任何k


    更重要的是,你认为你的语言最好的语法需要2到4之间的<代码> k>代码,因为有几种常见的编程构造。

    < P>有两种算法来确定语法是否是LL(k)。解析器生成器实现它们。如果可能的话,还有一些将语法转换为LL(k)的启发式方法

    但是您不需要将简单语言限制为LL(1),因为大多数现代解析器生成器(、和其他)都可以处理LL(k)中的任何k


    更重要的是,你认为你的语言最好的语法需要2到4之间的<代码> k>代码,因为有几种常见的编程结构。

    所以首先,你不一定希望你的语法是LL(1)。它使编写解析器变得更简单,并可能提供更好的性能,但这确实意味着您所使用的语言可能会比常用语言(通常不是LL(1))更加冗长

    如果可以的话,你的下一步就是在头脑中逐步理解语法,想象在这一点上可能出现的所有可能性,并检查它们是否可以通过第一个标记来区分

    制定语法有两条主要的经验法则LL(1)

  • 如果在给定的点上可以出现多个选项,那么它们可以 从相同的标记开始,在前面添加一个关键字,告诉您 作出了选择
  • 如果您有可选或重复的零件,请 确保后面跟着一个结束标记,该标记不能作为可选/重复部分的第一个标记出现
  • 尽可能避免在生产开始时使用可选零件。它使前两个步骤变得容易得多

  • 所以首先,你不一定希望你的语法是LL(1)。它使编写解析器变得更简单,并可能提供更好的性能,但这确实意味着您所使用的语言可能会比常用语言(通常不是LL(1))更加冗长

    如果可以的话,你的下一步就是在头脑中逐步理解语法,想象在这一点上可能出现的所有可能性,并检查它们是否可以通过第一个标记来区分

    制定语法有两条主要的经验法则LL(1)

  • 如果在给定的点上可以出现多个选项,那么它们可以 从相同的标记开始,在前面添加一个关键字,告诉您 作出了选择
  • 如果您有可选或重复的零件,请 当然有人跟踪了