【问题标题】:Parsing left recursive grammar解析左递归语法
【发布时间】:2012-08-30 11:51:35
【问题描述】:

我想为一种已经离开递归但我不知道该怎么做的语言制作一个解析器。 我唯一的解析经验是 ll(1)。

例如具有以下 bnf 定义

cqlQuery    ::=     prefixAssignment cqlQuery
| scopedClause
prefixAssignment    ::=     '>' prefix '=' uri
| '>' uri
scopedClause    ::=     scopedClause booleanGroup searchClause
| searchClause
booleanGroup    ::=     boolean [modifierList]
boolean     ::=     'and' | 'or' | 'not' | 'prox'
searchClause    ::=     '(' cqlQuery ')'
| index relation searchTerm
| searchTerm
relation    ::=     comparitor [modifierList]
comparitor  ::=     comparitorSymbol | namedComparitor
comparitorSymbol    ::=     '=' | '>' | '<' | '>=' | '<=' | '<>' | '=='
namedComparitor     ::=     identifier
modifierList    ::=     modifierList modifier | modifier
modifier    ::=     '/' modifierName [comparitorSymbol modifierValue]
prefix, uri, modifierName, modifierValue, searchTerm, index     ::=     term
term    ::=     identifier | 'and' | 'or' | 'not' | 'prox' | 'sortby'
identifier  ::=     charString1 | charString2

我是否必须转换左递归或做其他事情来避免它?

请不要给我翻译链接,因为我想手动完成,而不是使用程序进行解析。

【问题讨论】:

    标签: parsing syntax bnf


    【解决方案1】:

    如果您查看modifierList,它基本上需要至少一个修饰符。我们不需要做太多事情就可以摆脱左递归。

    modifierList ::= modifier [ modifierList ] 
    

    现在scopedClause 有点棘手,但如果我们推出第二个产品,它就会成功。 它总是需要至少一个searchClause,并且可以有多个booleanGroup searchClause

    scopedClauseTail ::= booleanGroup searchClause [ scopedClauseTail ] 
    scopedClause ::= searchClause [ scopedClauseTail ] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-03
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多