parsing - 具有 epsilon 转换的左递归 LR(0) 项的闭包是什么?

标签 parsing language-agnostic grammar lr-grammar epsilon

假设我有这个语法:

A: ε
 | B 'a'
B: ε
 | B 'b'

什么被视为项目的结束A: • B 'a'
换句话说,在计算闭包时如何处理 epsilon 转换?

最佳答案

这非常简单。包含在关闭中

    A = ... <dot> X ... ;

都是规则

    X =   <dot> R1 R2 R3 ... ;

其中第一个(R1) 不为空。对于第一个(R1)中的每个(非空)标记 K,您需要(传递!)包括

    R1 = <dot> k ... ;

等等。但想必您已经清楚这一点。

你的具体问题是如果 R1 可以为空会发生什么?那么你也 需要包含

    X =   R1 <dot> R2 ... ;

类似地,如果 R1 可以为空,则 R2 为空;如果 R1 .. Ri-1 可以为空,则 Ri 为空。在极端情况下,所有 Ri 都可以为空(语法中有很多可选子句),并且您最终可以包括

    X =  R1 R2 ... Rn <dot> ;

请注意,确定first(R1)“可以为空”本身就是一个传递闭包问题。

我为 DMS 构建的 GLR 解析器生成器使用 Warshall 算法预先计算 first_can_be_empty,然后在闭包构造中使用它。

关于parsing - 具有 epsilon 转换的左递归 LR(0) 项的闭包是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12968048/

相关文章:

language-agnostic - 程序结构设计工具? (自上而下的设计)

parsing - 解决语法问题的实用解决方案

python - NLP中简化标签的定义?

algorithm - 如何检测重复数据?

parsing - (Prolog) 将 Lisp s-表达式解析为 Prolog 术语

C++ SQLite 返回一些值?

PHP Mysql解析错误

python - 在不同平台上掀起浪潮

c - Bison/Yacc 语法中的无意串联

php - 如果还没有空格,如何在子字符串周围添加空格?