0

我一直在尝试解析连接的字符串,以便表达式也可以连接起来形成字符串。那是,

"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,我非常感谢在尝试找到它时提供的一些帮助。

4

1 回答 1

1

如果:

  1. 您不关心+运算符(加法或连接)如何关联;和
  2. 您不需要能够在字符串表达式周围使用括号,

那么有一个解决方案。我认为它更多的是一种智力练习,而不是一种实际的解决方案,部分原因是上述要求具有很高的限制性,部分原因是我认为您不应该使用具有两个不同优先级的同一个运算符。(事实上​​,我不太支持使用+for 连接。它的不同之处在于它应该有自己的符号。)

以下解决方案非常努力地确保字符串表达式与算术表达式区分开来,这要求字符串表达式不能以(. 为了避免连接过早减少,它使连接版本的+关联到右侧,而加法版本则正常关联到左侧。

S : E '+' A
  | E
  | A
  ;

A : QUOT '+' S
  | QUOT
  ;

E : E '+' T
  | E '-' T
  | T
  ;

T : T '*' F
  | T '/' F
  | F
  ;

F : NUM
  | '(' E ')'
  ;
于 2013-08-01T21:39:22.473 回答