哪些编程语言没有上下文?

时间:2009-05-22 15:31:15

标签: compiler-theory context-free-grammar

或者,更准确一点:哪种编程语言是由无上下文语法定义的?

从我收集的内容来看,由于宏和模板之类的东西,C ++不是无上下文的。我的直觉告诉我,函数式语言可能没有上下文,但我没有任何硬数据来支持它。

简明例子的额外代表: - )

8 个答案:

答案 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)

我认为HaskellML支持上下文无关。请参阅此link了解Haskell。

答案 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)。

因此存在(或可能没有,我还没有仔细检查过)上下文无关的语法,但是到目前为止,您只能解析程序。