或者,更准确一点:哪种编程语言是由无上下文语法定义的?
从我收集的内容来看,由于宏和模板之类的东西,C ++不是无上下文的。我的直觉告诉我,函数式语言可能没有上下文,但我没有任何硬数据来支持它。
简明例子的额外代表: - )
答案 0 :(得分:33)
语法正确的程序集对于几乎所有语言都是无上下文的。
对于几乎所有语言,编译的程序集不是无上下文的。例如,如果所有编译C程序的集合都是无上下文的,那么通过与常规语言(也称为正则表达式)交叉,匹配所有编译C程序的集合
^int main\(void\) { int a+; a+ = a+; return 0; }$
将是无上下文的,但这显然与语言a ^ kba ^ kba ^ k同构,这是众所周知的不无上下文。
答案 1 :(得分:8)
根据您对问题的理解,答案会发生变化。但IMNSHO,正确的答案是所有现代编程语言实际上都是上下文敏感的。例如,没有上下文无关语法只接受语法正确的C程序。那些指向C语言的yacc / bison上下文无关语法的人都忽略了这一点。
答案 2 :(得分:3)
为了获得非语境无语法的最具戏剧性的例子,Perl的语法就像我理解的那样turing-complete。
答案 3 :(得分:3)
如果我理解您的问题,那么您正在寻找可以通过上下文无关语法(cfg)描述的编程语言,以便cfg生成所有有效的程序并且只生成有效的程序。
我相信大多数(如果不是全部)现代编程语言因此不是上下文。例如,一旦您拥有用户定义的类型(在现代语言中非常常见),您就会自动对上下文敏感。
验证语法和验证程序的语义正确性之间存在差异。检查语法是无上下文的,而检查语义正确性则不是(同样,在大多数语言中)。
然而,这并不意味着这种语言不可能存在。例如,无类型lambda calculus可以使用无上下文语法来描述,当然,图灵完成。答案 4 :(得分:2)
VHDL在某种程度上与上下文有关:
VHDL以同样的方式对上下文敏感。考虑一下这个陈述 过程:
jinx := foo(1);
那么,取决于在流程范围内定义的对象(及其 封闭范围),这可以是:
- 功能调用
- 索引数组
- 索引由无参数函数调用返回的数组
要正确解析,解析器必须携带分层符号表 (附带范围),当前文件甚至不够。
foo
可以是 包中定义的函数。所以解析器应该首先分析包 由它正在解析的文件导入,并找出它们中定义的符号。这只是一个例子。 VHDL类型/子类型系统是类似的 上下文敏感的混乱,很难解析。
(Eli Bendersky,“Parsing VHDL is [very] hard”,2009)
答案 5 :(得分:2)
答案 6 :(得分:2)
大多数现代编程语言都不是无上下文的语言。作为证据,如果我深入研究CFL的根,它的相应机器PDA就不能处理像{ww | w is a string}
这样的字符串匹配。所以大多数编程语言都需要这样
示例:
int fa; // w
fa=1; // ww as parser treat it like this
答案 7 :(得分:0)
让我们以Swift为例,用户可以在其中定义运算符,包括运算符优先级和关联性。例如,运算符+和*实际上是在标准库中定义的。
上下文无关文法和词法分析器可能能够解析a + b-c * d + e,但语义是“五个操作数a,b,c,d和e,由运算符+,-, *和+”。这是解析器无需了解运算符就可以实现的。上下文无关文法和词法分析器也可以解析a-+ b-+-c,这是由运算符+-+和-+-分隔的三个操作数a,b和c。
解析器可以根据上下文无关的Swift语法“解析”源文件,但这远没有完成。另一步骤是收集有关运算符的知识,然后将a + b-c * d + e的语义更改为与operator +(operator-(operator +(a,b),operator *(c,d))相同, e)。
因此存在(或可能没有,我还没有仔细检查过)上下文无关的语法,但是到目前为止,您只能解析程序。