Parsing 解析左递归语法

Parsing 解析左递归语法,parsing,syntax,bnf,Parsing,Syntax,Bnf,我想为一种只剩下递归的语言做一个解析器,但我不知道该怎么做。 我在解析方面的唯一经验是ll(1) 例如,具有以下bnf定义 cqlQuery ::= prefixAssignment cqlQuery | scopedClause prefixAssignment ::= '>' prefix '=' uri | '>' uri scopedClause ::= scopedClause booleanGroup searchClause |

我想为一种只剩下递归的语言做一个解析器,但我不知道该怎么做。 我在解析方面的唯一经验是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
cqlQuery::=前缀分配cqlQuery
|scopedClause
前缀分配::='>'前缀'='uri
|“>”uri
scopedClause::=scopedClause booleanGroup searchClause
|搜索子句
booleanGroup::=布尔[modifierList]
布尔值::='和'|'或'|'不是'|'prox'
search子句::='('cqlQuery')'
|索引关系搜索项
|搜索词
关系::=比较器[modifierList]
比较器::=比较器符号|名称比较器

comparitorSymbol::='='''|'>'|'='|'如果查看
modifierList
它基本上至少需要一个修饰符。我们不需要做太多的工作来摆脱左递归

modifierList ::= modifier [ modifierList ] 
现在
scopedClause
有点棘手,但如果我们进行第二次生产,它就会成功。 它总是需要至少一个
searchClaire
,并且可以有多个
booleanGroup searchClaire

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