用于字符串串联的LALR语法



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

"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,我真的很感激在寻找它的过程中得到一些帮助。

如果:

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

那么就有了解决方案。我认为这更多的是一种智力练习,而不是一种实际的解决方案,部分原因是上述要求具有高度限制性,部分原因在于我认为不应该使用具有两个不同先例的同一运算符。(事实上,我不太支持使用+进行串联。它的不同之处在于它值得拥有自己的符号。)

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

S : E '+' A
  | E
  | A
  ;
A : QUOT '+' S
  | QUOT
  ;
E : E '+' T
  | E '-' T
  | T
  ;
T : T '*' F
  | T '/' F
  | F
  ;
F : NUM
  | '(' E ')'
  ;

相关内容

  • 没有找到相关文章

最新更新