如何使C语言无上下文?

时间:2017-05-23 17:45:24

标签: c parsing compiler-construction lexical-analysis

我知道 C 不是一种无上下文的语言,一个着名的例子是:

int foo;
typedef int foo;
foo x;

在这种情况下,词法分析员不知道第3行中的foo是标识符还是typedef

我的问题是,这是使 C 上下文敏感语言的唯一原因吗?

我的意思是,如果我们摆脱typedef,它会成为无语境的语言吗?或者有其他原因(例子)阻止它如此?

3 个答案:

答案 0 :(得分:4)

是。 C可以使用经典的lex + yacc组合进行解析。词法分析器定义和yacc语法可以在

免费获得

http://www.quut.com/c/ANSI-C-grammar-l-2011.htmlhttp://www.quut.com/c/ANSI-C-grammar-y-2011.html

从lex文件中可以看出,除了上下文相关的check_type()(和comment(),但注释处理在技术上属于预处理器)之外,它很简单,这使得typedef那里唯一的情境敏感来源。由于yacc文件不包含任何上下文敏感度引入技巧,因此typedef - 更少的C将是完全无上下文的语言。

答案 1 :(得分:0)

没有。 C不能是严格的上下文独立语言。为此,您应该以与您在问题中描述的方式类似的方式描述不允许使用非声明变量(这是上下文)的语法。语言作者总是使用某种上下文无关语法来描述语法,但只是描述语言的主要句法结构。您描述的案例(使类型标识符适合不同的令牌类,以便能够进入不应该的地方)只是一个例子。如果你看一下例子,static unsigned long long int variable之类的顺序的自由简化了程序员记忆的语法,但使编译器作者的事情变得复杂。

答案 2 :(得分:0)

根据我的知识和研究,使C上下文敏感的语言有两个基本原因。这些是:

  1. 在使用变量之前先声明它。
  2. 匹配功能或子例程的形式参数和实际参数。

这两个功能不能通过下推自动机(PDA)完成,但是线性有界自动机(LBA)可以做到这两个。