(我正在度假时间谈论一些语言理论.如果这是一个天真的问题,请原谅.)
根据这里:
LL语法,特别是LL(1)语法,具有很大的实际意义,因为这些语法的解析器易于构造,并且由于这个原因,许多计算机语言被设计为LL(1).
那么,出于好奇,当代计算机语言是LL(1)?C,Java,C#或Python是否属于这一类?
我正在寻找一种有趣的编程语言,但是我所看到的大多数资源都是用于编写无上下文的语言,但我希望编写一种像python一样使用缩进的语言,这对我的理解意味着它可以没有上下文.
python compiler-construction interpreter programming-languages
我对上下文敏感度和模糊性如何相互影响感到困惑.
我认为是正确的是:
歧义:
模糊语法导致使用左或右派生构造多个解析树.所有可能的语法都含糊不清的语言是一种含糊不清的语言.
例如,C++是一种含糊不清的语言,因为x*y总是意味着两种不同的东西,如下所述:为什么不能用LR(1)解析器解析C++?.
上下文灵敏度:
上下文敏感语法具有规则,其中这些规则的左侧可以包含(非)终端符号,除了在不同类型语法的所有规则的lhs内所需的一个非终结符号之外.这意味着您不能在降序时替换非终结符.相反,你必须先看看周围的非终结者.
现在困扰我的是那些或多或少说上下文敏感的解析器可以解析像x*y这样的歧义的语句.例如,在上面的链接问题中,声明"... [在创建语法树时装饰语法树]的解析器不是上下文无关的,而LR解析器(纯粹的解析器)是无上下文的." 在我看来,这意味着上下文敏感的解析器(与无上下文解析器相反?)可以做到这一点.另一个例子是C++语法上下文的任何部分都是敏感的吗?这个问题用"是......"回答.同样在这里:什么是模糊的上下文自由语法?
我不明白这个C++模糊性与上下文敏感性有什么关系.我不认为有任何上下文敏感的语法可以处理这种歧义.例如,如果你采用像Typedef,<other>*,PointerDeclaration - > Ident"*"Ident这样的虚构规则
那么你仍然无法确定(使用纯解析)在Typedef期间是否使用了具体的第一个Ident(例如"x")(例如typedef double x;).
因此,可能在链接的问题中使用术语"上下文敏感性",尽管意味着像上下文依赖一样简单(例如,需要比简单解析器提供的更多信息).或者"真实的"上下文敏感性"与歧义之间是否有任何联系.
编辑更多指定问题:在无上下文语法中是否存在任何可以通过使用上下文相关语法处理的歧义.这个问题发生在我身上,因为在链接的问题中,它听起来像C++模糊性有时被称为上下文敏感性问题.
Edit2附加信息:计算机系统在第346页上指出,上下文相关语法可以表示具有相同数量的实际和形式参数的要求.但这非常麻烦,因为你需要很多复杂的规则.但也许这也适用于前面提到的C++模糊性.所以我们有像这样的规则
"Typedef double x",<other>*,PointerDeclaration - >"x""*"Ident
当然,这些规则将非常有限,你需要大量的表达每种可能性.至少这可能是问题答案的一种方法,如果(理论上)无上下文的自由模糊可以用上下文敏感规则的使用来代替
根据维基百科上的"递归下降解析器",只有LL(k)语法才能实现没有回溯(也就是预测解析)的递归下降.
在其他地方,我已经读过Lua的实现使用这样的解析器.但是,该语言不是 LL(k).事实上,Lua天生就是含糊不清的:是a = f(g)(h)[i] = 1指a = f(g); (h)[i] = 1还是a = f; (g)(h)[i] = 1?这种歧义通过解析器中的贪婪来解决(因此上面被解析为错误的a = f(g)(h)[i]; = 1).
这个例子似乎表明预测解析器可以处理不是LL(k)的语法.事实上,它们是否能够处理LL(k)的超集?如果是这样,有没有办法找出一个给定的语法是否在这个超集中?
换句话说,如果我正在设计一种我想使用预测解析器解析的语言,我是否需要将语言限制为LL(k)?或者我可以适用更宽松的限制吗?
lua parsing recursive-descent context-free-grammar ll-grammar
根据此答案 => Scala中是具有两种不同的含义关键字:1来表示一个功能类型:Double => Double和2以创建lambda表达式:(x: Double): Double => 2*x.
这与正式语法有什么关系,即这会使Scala上下文敏感吗?
我知道大多数语言都没有上下文,但我不确定我所描述的情况是否与此有关.
编辑:
好像我不太了解上下文敏感的语法.我知道生产规则应该是什么样子,以及它们的含义("只有当A被这些符号包围时才适用这种生产"),但我不确定它们与实际(编程)语言的关系.
我认为我的困惑源于阅读"乔姆斯基引入这个术语,因为一个词的含义可能取决于它的语境",并且我=>在引用中与术语"单词"相关联,并且它的两个用法是两个独立的上下文.
如果一个答案可以解决我的困惑,那就太好了.
几乎没有任何编程语言的句法语法是规则的,因为它们允许任意深度嵌套的括号。Rust 也这样做:
let x = ((((()))));
Run Code Online (Sandbox Code Playgroud)
但 Rust 的句法语法至少是上下文无关的吗?如果不是,什么元素使语法与上下文相关?或者语法甚至是递归可枚举的,就像C++ 的句法语法一样?
grammar ×2
ll-grammar ×2
ambiguity ×1
c++ ×1
interpreter ×1
lua ×1
parsing ×1
python ×1
rust ×1
scala ×1