parsing - 如何确定一种语言是否为 LL(1)?

标签 parsing ll

我有一个语法,我可以检查 is 是否是 LL(1)。但是,有什么方法可以检查语法生成的语言是否为LL(1)? LL(1) 语法和 LL(1) 语言之间到底有什么区别?

最佳答案

任何 LL(1) 语法都定义了 LL(1) 语言。根据定义,一种语言是 LL(1),如果有一些语法生成它是 LL(1),所以你有一个语言的 LL(1) 语法的事实自动意味着语言是 LL(1) .

详细地说,一种语言是一组字符串,该语言的语法是描述该语言的一种方式。一些语言有 LL(1) 语法,而另一些则没有。然而,文法不是 LL(1) 的事实并不意味着它所描述的语言不是。例如,考虑这个语法:

A -> ab | ac

此文法不是 LL(1),因为在看到终端 a 时尝试预测 A 的产生式时,它包含 FIRST/FIRST 冲突。但是,它描述的是 LL(1) 语言,因为该语言也由语法描述
A -> aX
X -> b | c

所以这些语法(只包含 ab 和 ac)生成的语言确实是 LL(1)。

确定由任意文法描述的语言是否为 LL(1) 要困难得多,据我所知,唯一的方法是明确地展示由初始文法生成的语言的 LL(1) 文法(这很棘手)或在数学上证明不存在这样的语法。

希望这可以帮助!

关于parsing - 如何确定一种语言是否为 LL(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133778/

相关文章:

python - 在 Python 中解析结构化文本文件 (pyparsing)

json - 如何使用 SuperObject 序列化包含点(例如 IP 地址)的 JSON key ?

haskell - Parsec:预测解析

python - 能否修改 ANTLR 语法文件以供 PLY 使用?

algorithm - 解析上下文无关文法

java - 将对象序列化为 XML 并追加 1 天

c++ - boost::spirit:多维输入的迭代器和解析器

php - 如何在 PHP 中使用 XMLReader?

programming-languages - LL 与 LR 解析器的局限性?

parsing - 基于表的 LL 解析器可以在没有右递归的情况下处理重复吗?