Questions tagged «context-free-grammar»

20
C ++是上下文无关的还是上下文相关的?
我经常听到有人声称C ++是上下文相关的语言。请看以下示例: a b(c); 这是变量定义还是函数声明?这取决于符号的含义c。如果c是变量,则a b(c);定义一个名为btype 的变量a。直接用初始化c。但如果c是类型,则a b(c);声明一个名为的函数b,该函数采用a c并返回a a。 如果您查看无上下文语言的定义,它将基本上告诉您所有语法规则的左手边必须仅由一个非终结符组成。另一方面,上下文相关的语法允许在左侧使用任意字符串的终止符和非终止符。 浏览“ C ++编程语言”的附录A,我找不到一个单独的语法规则,该规则除左侧有一个非终结符外还没有其他内容。这意味着C ++是无上下文的。(当然,每种上下文无关的语言也是上下文敏感的,因为上下文无关的语言构成了上下文敏感语言的子集,但这并不是重点。) 那么,C ++是上下文无关的还是上下文相关的?

2
什么是上下文无关语法?
有人可以向我解释什么是上下文无关的语法吗?在查看了Wikipedia条目,然后查看了有关正式语法的Wikipedia条目之后,我完全被迷住了。有人会乐于解释这些东西吗? 我想知道这一点是因为我希望研究解析以及正则表达式引擎的局限性。 我不确定这些术语是否与编程直接相关,或者它们是否与语言学总体上更相关。抱歉,如果这样的话,也许可以动议吗?

8
常规与上下文无关文法
我正在为我的计算语言测试而学习,并且有一个主意我无法解决。 我知道常规语法更简单,不能包含歧义,但是不能完成编程语言所需的许多任务。我还了解到,无上下文语法允许模棱两可,但是允许编程语言(例如回文集)需要一些必要的东西。 我遇到的麻烦是,通过了解常规语法非终结符可以映射到一个终端或一个非终结符,然后再一个终结符,或者上下文无关的非终结符可以映射到终端和非终结符的任何组合,来理解上述所有方法。 有人可以帮我把所有这些放在一起吗?

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

1
LL和递归下降解析器之间的区别?
我最近正在尝试自学解析器(针对语言/无上下文语法)的工作方式,除了一件事之外,大多数解析器似乎都有意义。我特别关注LL(k)语法,这两个主要算法似乎是LL解析器(使用堆栈/解析表)和递归下降解析器(仅使用递归)。 据我所知,递归下降算法适用于所有LL(k)语法,甚至可能更多,而LL解析器适用于所有LL(k)语法。但是,递归下降解析器显然比LL解析器要简单得多(就像LL解析器比LR解析器一样简单)。 所以我的问题是,使用两种算法时可能遇到的优点/问题是什么?鉴于LL处理相同的语法集并且实现起来比较棘手,为什么人们会选择LL而不是递归血统?

2
为什么C的BNF语法允许使用init-declarator的空序列进行声明?
当查看C的BNF语法时,我认为声明的生产规则看起来像这样很奇怪(根据https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C%20in%20Backus-Naur%20form.htm): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; 为什么要*为此使用量词(表示零次或多次出现)init-declarator?这允许诸如int;或之类的语句void;在语法上有效,即使它们在语义上无效。他们难道不是在生产规则中使用了+量词(一次或多次)*吗? 我尝试编译一个简单的程序,以查看编译器的输出,它所做的只是发出警告。 输入: int main(void) { int; } 输出: test.c: In function ‘main’: test.c:2:5: warning: useless type name in empty declaration int; ^~~
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.