繁体   English   中英

查找等效的LR语法

[英]Find an equivalent LR grammar

我正在尝试为pascal查找LR(1)或LR(0)语法。 这是我语法的一部分,不是LR(0),因为它具有移位/减少冲突。

EXPR --> AEXPR | AEXPR realop AEXPR
AEXPR --> TERM | SIGN TERM | AEXPR addop TERM
TERM --> TERM mulop FACTOR | FACTOR
FACTOR --> id | num | ( EXPR )
SIGN --> + | - 

(大写单词是变量,小写单词+,-是终端)

如您所见, EXPR --> AEXPR | AEXPR realop AEXPR EXPR --> AEXPR | AEXPR realop AEXPR在LR(0)解析上引起移位/减少冲突。 我尝试添加一个新变量,以及其他一些方法来为此找到等效的LR(0)语法,但是我没有成功。

我有两个问题。

第一:该语法是LR(1)语法吗?

第二:是否有可能找到与此语法对应的LR(0)? 等效于LR(1)呢?

是的,您的语法是LR(1)语法。 [请参阅下面的注释]

不仅仅是第一个产生LR(0)冲突的产品。 在LR(0)语法中,您必须能够预测是否要平移或减少(以及减少哪种产生), 而无需参考前瞻符号 这是一个严格的要求。

尽管如此,还是有一种语法可以识别相同的语言。 从某种意义上说,它不是等效语法,因为它不会产生相同的解析树(或任何有用的解析树),因此它取决于您认为等效的东西。

EXPR → TERM | EXPR OP TERM
TERM → num | id | '(' EXPR ')' | addop TERM
OP   → addop | mulop | realop

上面通过忽略运算符优先级来工作; 它只将表达式视为常规语言TERM (op TERM)* (我将+ | -更改为addop因为我看不到扫描仪的工作方式,但这并不重要。)

通常有一种转换使LR(1)表达式语法适合LL(1)解析,但是由于允许LL(1)检查前瞻字符,因此它能够以正常方式处理运算符优先级。 LL(1)“等效”语法不会产生具有正确的运算符关联性的解析树-所有运算符都变为右关联的-但是可以通过简单的树旋转来恢复正确的解析树。

在LR(0)语法的情况下,运算符的优先级已丢失,树变换几乎等同于解析输入,使用诸如shunting yard算法之类的东西来创建真实的解析树。


注意

我不相信所提供的语法是正确的语法,因为它使一元加号和减号的绑定不如乘法更紧密,其结果是-3*4被解析为-(3*4) 碰巧的是,大多数时候并没有语义上的差异,但是我仍然觉得这是错误的。 我将语法写为:

EXPR   → AEXPR  | AEXPR realop AEXPR
AEXPR  → TERM   | AEXPR addop  TERM
TERM   → FACTOR | TERM  mulop  FACTOR
FACTOR → num | id | '(' EXPR ')' | addop FACTOR

一元运算符的绑定更加紧密。 (如上所述,我假设addop+- 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM