解析左递归语法

时间:2012-08-30 11:51:35

标签: parsing syntax bnf

我想为一个已经离开递归的语言创建一个解析器,我不知道该怎么做。 我解析的唯一经验是使用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

我是否必须转换左递归或执行其他操作以避免它?

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

1 个答案:

答案 0 :(得分:2)

如果你看一下modifierList,它基本上至少需要一个修饰符。我们没有做太多的事情来摆脱左递归。

modifierList ::= modifier [ modifierList ] 

现在scopedClause有点棘手,但如果我们突破第二次制作,它就会成功。 它始终至少需要一个searchClause,并且可以有多个booleanGroup searchClause

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