将EBNF转换为BNF以获取LALR解析器

时间:2012-01-30 05:08:37

标签: parsing grammar bison bnf ebnf

我知道有几个帖子的标题相似。大多数链接到一个死网站 - 我还有一个更具体的问题。

我正在尝试将EBNF in the XPath spec转换为直接BNF,这样我就可以轻松创建一个兼容Bison的语法文件。

我已经做了一段时间了,我不记得递归属于哪一方。我认为这是左边的 - 但是当我们通过Bison生成的解析器运行时,我的“直接”翻译使用普通的XPath表达式给出了语法错误。

所以如果有人可以幽默我并且权衡 - 所以我不是在追逐鬼魂:

在以下Expr规则中:

Expr::=     
    ExprSingle ("," ExprSingle)*

这是正确的翻译吗? (将递归放在左侧):

Expr::= 
    Expr "," ExprSingle
    | ExprSingle

2 个答案:

答案 0 :(得分:4)

那很好......

你可以把递归放在右边,它应该可以工作,但你会让解析器“做更多的工作”,因为它必须跟踪递归的主干,并且这样做它必须使用更多的堆栈位置。

答案 1 :(得分:0)

您的翻译将按照规则Expr进行递归,并接受其他Expr的生产形式。

正确的翻译应该是:

Expr::=
    ExprSingle Expr1
Expr1::=
    Expr1 "," ExprSingle | ε