我一直在尝试解析连接的字符串,这样表达式也可以连接起来形成字符串。也就是说,
"No, " + 4*(6+5)/(8-4) + " is not equal to " + 75*1.3 + "."
以上内容应正确解析。问题是+
导致了偏移减少冲突。我一直在使用以下语法;
<S> ::= <A> '+' <S>
| <A>
<A> ::= <E>
|QUOT
<E> ::= <T> '+' <E>
| <T> '-' <E>
| <T>
<T> ::= <F> '*' <T>
| <F> '/' <T>
| <F>
<F> ::= NUM
| '(' <E> ')'
我还没有成功地找到一种+
不会导致移位-减少冲突的语法。我希望有一种方法可以使这个语法成为LALR,我真的很感激在寻找它的过程中得到一些帮助。
如果:
- 您不关心
+
运算符(加法或串联)是如何关联的;以及 - 您不需要能够在字符串表达式周围使用括号
那么就有了解决方案。我认为这更多的是一种智力练习,而不是一种实际的解决方案,部分原因是上述要求具有高度限制性,部分原因在于我认为不应该使用具有两个不同先例的同一运算符。(事实上,我不太支持使用+
进行串联。它的不同之处在于它值得拥有自己的符号。)
以下解决方案非常努力地确保字符串表达式与算术表达式可区分,这要求字符串表达式不能以(
开头。为了避免过早减少级联,它使+
的级联版本与右侧关联,而加法版本与左侧关联。
S : E '+' A
| E
| A
;
A : QUOT '+' S
| QUOT
;
E : E '+' T
| E '-' T
| T
;
T : T '*' F
| T '/' F
| F
;
F : NUM
| '(' E ')'
;