Tag: 上下文无关语法

什么编程语言是上下文无关的?

或者,更精确一点:哪些编程语言是由上下文无关文法定义的? 从我收集的内容来看,由于macros和模板等原因,C ++没有上下文。 我的直觉告诉我,函数式语言可能是上下文无关的,但我没有任何硬性数据来支持。 额外代表简洁的例子:-)

D的语法真的是上下文吗?

我已经在几个月前在D新闻组上发布了这个消息,但是由于某种原因,答案从来没有真正让我信服,所以我想我会在这里问。 D的语法显然是上下文无关的 。 但是,C ++的语法不是(即使没有macros)。 ( 请仔细阅读! ) 现在被授予, 我对编译器,词法分析器和parsing器一无所知 (正式)。 我所知道的是从我在网上学到的东西。 以下是我所了解的关于上下文的一些(我相信),用不太专业的术语: 语言的语法是上下文无关的, 当且仅当你总是可以理解给定代码段的含义(尽pipe不一定是确切的行为),而不需要在其他地方“看”。 或者,更不严格的是: 如果我需要的话,语法不能是上下文无关的,我只是通过查看它不能告诉expression式的types。 因此,例如,C ++由于confusing<sizeof(x)>::q < 3 > (2)的含义 取决于q的值 ,因此上下文无关testing失败。 到现在为止还挺好。 现在我的问题是:D可以这样说吗? 在D中,哈希表可以通过Value[Key]声明创build,例如 int[string] peoplesAges; // Maps names to ages 静态数组可以用类似的语法来定义: int[3] ages; // Array of 3 elements 和模板可以用来使他们感到困惑: template Test1(T…) { alias int[T[0]] Test; } template Test2(U…) { alias […]

LL和recursion下降parsing器之间的区别?

最近我正在试图自学自己的parsing器(语言/上下文无关文法)是如何工作的,大部分似乎是有意义的,除了一件事情。 我将注意力集中在LL(k)语法 ,其中两种主要algorithm似乎是LL语法分析器 (使用堆栈/分析表)和recursion下降语法分析器 (简单地使用recursion)。 就我所见,recursion下降algorithm适用于所有LL(k)语法,可能更多,而LLparsing器适用于所有LL(k)语法。 然而,recursion下降parsing器显然要比LLparsing器更简单(就像一个LLparsing器比LRparsing器一样简单)。 所以我的问题是,使用任何一种algorithm时可能遇到的优点/问题是什么? 为什么有人会selectrecursion下降的LL,因为它在同一组语法上工作,而且更难实现?

什么是上下文无关语法?

有人可以向我解释一个上下文无关的语法是什么? 看过维基百科条目,然后看维基百科的正式语法条目之后,我完全置之不理。 有人会这么好解释这些东西是什么? 我想知道这一点,因为我希望调查parsing,并在一边,正则expression式引擎的限制。 我不确定这些术语是直接编程相关的,还是与语言学有关。 如果是这样的话,我很抱歉,如果是这样的话,也许这可能会被移动?

定期与上下文无关文法

我正在学习我的计算机语言testing,有一个想法,我有问题包扎我的头。 我明白, 正规的语法比较简单,不能含有歧义,但是不能完成许多编程语言所需的任务。 我也明白, 上下文无关语法允许含糊不清,但允许编程语言(如回文)所需的一些东西。 我遇到的麻烦是理解如何通过知道规则语法非终止符可以映射到一个terminal或一个非终结符跟随terminal或上下文无关非终结符映射到任何terminal和非终结符的组合。 有人能帮我把所有这些放在一起吗?

C ++上下文无关或上下文敏感?

我经常听到C ++是一种上下文敏感语言的说法。 以下面的例子: ab(c); 这是一个variables定义或函数声明? 这取决于符号c的含义。 如果c是variables ,则ab(c); 定义了一个types为b的variablesb 。 它直接用c初始化。 但如果c是一个types ,那么ab(c); 声明一个名为b的函数,它接受一个c并返回一个a 。 如果你查找上下文无关语言的定义,它将基本上告诉你,所有的语法规则都必须包含一个只包含一个非终结符号的左边。 另一方面,上下文敏感的语法允许在左侧的任意string的terminal和非terminal符号。 通过浏览“C ++编程语言”的附录A,我找不到一个单独的文法规则,除了左边的一个非terminal符号外,还有其他的东西。 这意味着C ++是上下文无关的。 (当然,上下文无关的语言也是上下文敏感的,上下文无关语言构成上下文敏感语言的一个子集,但这不是重点。) 那么,C ++是上下文无关的还是上下文敏感的?

“现代”正则表达式的认知力

真正的现代正则表达式实际上认可什么类型的语言? 每当有一个带有反向引用的无限长度捕获组(例如(.*)_\1 ),正则表达式现在就匹配一个非正则语言。 但是,它本身不足以匹配像S ::= '(' S ')' | ε S ::= '(' S ')' | ε – 匹配成对副本的上下文无关语言。 递归正则表达式(对我来说是新的,但我确信存在于Perl和PCRE中)至少可以识别大多数CFL。 有没有人做过或读过这方面的研究? 这些“现代”正则表达式的局限性是什么? 他们是否认可LL或LR语法的严格多于或者少于CFG? 或者是否存在可以被正则表达式识别但不是CFG的两种语言,反之亦然? 有关论文的链接将不胜感激。