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