我想为一个已经离开递归的语言创建一个解析器,我不知道该怎么做。 我解析的唯一经验是使用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
我是否必须转换左递归或执行其他操作以避免它?
请不要给我翻译人员的链接,因为我想手动完成,而不是使用程序进行解析。
答案 0 :(得分:2)
如果你看一下modifierList
,它基本上至少需要一个修饰符。我们没有做太多的事情来摆脱左递归。
modifierList ::= modifier [ modifierList ]
现在scopedClause
有点棘手,但如果我们突破第二次制作,它就会成功。
它始终至少需要一个searchClause
,并且可以有多个booleanGroup searchClause
。
scopedClauseTail ::= booleanGroup searchClause [ scopedClauseTail ]
scopedClause ::= searchClause [ scopedClauseTail ]