Tag: context free grammar

LL1语法中的左递归消除

我试图从以下语法提取中消除左递归 – expression := fragment ( ( + | – | * | / ) fragment )* fragment := identifier | number | ( + | – ) fragment | expression 问题是表达式可以去片段,可以去表达。 我已经尝试了很多方法来消除它,有些看起来像是在工作(在JavaCC中),但我是a)不确定它们的正确性,并且b)很确定我通过改变语法结构来破坏关联性。 我很确定我需要一个表达’,并且有 fragment := identifier | number | ( + | – ) fragment | expression 变成 fragment := identifier | number | […]

Java,C ++,C#等如何利用解决这种特殊的语法歧义?

我以前认为C ++是“奇怪的”,但是在使用<和>会有一些歧义,但在尝试实现解析器后,我想我找到了一个例子,它打破了使用<和>作为generics类型的每种语言: f(g(j)); 这可以在语法上解释为generics方法调用( g ),或者可以解释为给出两个比较的结果。 这些语言(特别是Java, 我认为应该是LALR(1) – 可解决的? )如何克服这种语法模糊性? 我无法想象任何非hacky / context-free方式来解决这个问题,而且我对任何这样的语言如何无上下文感到困惑,更不用说LALR(1)-parsable …… (值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)