为什么我的小语法中有3个解析冲突?

时间:2011-03-03 05:03:06

标签: context-free-grammar lemon

//complete
start ::= template.

//template
template ::= template_elements.
template ::= template template_elements.
template ::= .

//template elements
template_elements(res) ::= COMMENT. 
template_elements(res) ::= tag(t). 

//tag
tag(res) ::= LDEL exp(e) RDEL. 

//exp
exp(res) ::= value(v). 
exp(res) ::= exp(e1) OP(o) exp(e2).

//value
value(res) ::= variable(v). 

//variable
variable(res) ::= DOLLAR ID(i).

任何人都知道冲突的位置?

更新

如果我删除exp(res) ::= exp(e1) OP(o) exp(e2).,那么只会发生两次冲突,但我不知道为什么会造成冲突......

UPDATE2

为什么没关系here

template ::= template_elements.
template ::= template template_elements.
template ::= .

1 个答案:

答案 0 :(得分:0)

要修复exp歧义,请设置优先级和关联性 - 请参阅优先规则下的documentation

Lemon可以处理左递归,但您的template规则应该是

template ::= template template_elements.
template ::= .

由于template可以为空,因此您不需要template ::= template_elements案例。

进行这些更改后会出现什么错误?