我经常听到C++是一种上下文敏感语言的说法.请看以下示例:
a b(c);
Run Code Online (Sandbox Code Playgroud)
这是变量定义还是函数声明?这取决于符号的含义c.如果c是变量,则a b(c);定义名为btype 的变量a.它是直接初始化的c.但是如果c是一个类型,则a b(c);声明一个名为a的函数b,c并返回一个a.
如果您查找无上下文语言的定义,它基本上会告诉您所有语法规则必须具有仅由一个非终端符号组成的左侧.另一方面,上下文敏感语法允许左侧的任意字符串的终端和非终端符号.
浏览"C++编程语言"的附录A,除了左侧的单个非终端符号之外,我找不到单个语法规则.这意味着C++是无上下文的.(当然,在无上下文语言形成上下文敏感语言的子集的意义上,每种无上下文语言也都是上下文敏感的,但这不是重点.)
那么,C++是无上下文还是上下文敏感?
c++ syntax grammar context-free-grammar context-sensitive-grammar
我正在阅读解析器和解析器生成器,并在维基百科的LR解析页面中找到了这个语句:
可以使用LR解析器的一些变体来解析许多编程语言.一个值得注意的例外是C++.
为什么会这样?C++的哪个特定属性导致无法使用LR解析器进行解析?
使用谷歌,我只发现C可以用LR(1)完美解析,但C++需要LR(∞).
我熟悉C和C++的语法是上下文相关的事实,特别是你需要在C中使用"lexer hack".另一方面,我的印象是你只能解析Java尽管两种语言之间存在相当大的相似性,但仍有2个前瞻性令牌.
你需要改变什么才能使它更易于解析?
我问,因为我所见过的关于C的上下文敏感性的所有例子在技术上都是允许的,但非常奇怪.例如,
foo (a);
Run Code Online (Sandbox Code Playgroud)
可以foo用参数调用void函数a.或者,它可以声明a是一个类型的对象foo,但你可以很容易地摆脱parantheses.在某种程度上,这种奇怪之处的发生是因为C语法的"直接声明者"生成规则实现了声明函数和变量的双重目的.
另一方面,Java语法具有用于变量声明和函数声明的单独生成规则.如果你写
foo a;
Run Code Online (Sandbox Code Playgroud)
然后你知道它是一个变量声明,foo可以毫不含糊地解析为一个类型名.如果foo尚未在当前作用域中的某处定义类,则这可能不是有效代码,但这是可以在稍后的编译器传递中执行的语义分析的工作.
我已经看到它说由于typedef很难解析C,但你也可以在Java中声明自己的类型.此外direct_declarator,哪种C语法规则有错?
我正在编写一个小型解释器,用于简单的BASIC语言,使用avr-gcc工具链在C语言的AVR微控制器上练习.但是,我想知道是否有任何开源工具可以帮助我编写词法分析器和解析器.
如果我写这个在我的Linux机器上运行,我可以使用flex/bison.现在我把自己限制在一个8位平台上,我必须手动完成所有操作,不是吗?
为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.
看起来clang过去有这个功能(-emit-asm),但它已经删除了.
今天有一个简单的方法吗?
在C++中,符号"<"和">"用于比较以及表示模板参数.因此,代码片段
[...] Foo < Bar > [...]
Run Code Online (Sandbox Code Playgroud)
可能被解释为以下两种方式中的任何一种:
C++编译器的解析器如何有效地决定这两种可能性?
我认为 Bison 和 Yacc 经常用于解析编程语言的语法。(以及用于标记化的 lex/flex...)
我的问题是:所有编译器都是用这个工具制作的还是有人从头开始编写解析器?(我主要是在没有“编译器编译器”的情况下完成的,但我知道它们)
在没有这些工具的情况下构建解析器是否“有利可图”?
yacc/bison 和 lex/flex 是否有更“开放”且不那么严格的替代方案。是否存在 C 库可以为我做这件事(解析)?是否有另一种选择可以在没有 yacc 的情况下构建解析器,但也不从头开始编写它?
最好的问候卢卡斯
我最近了解到C 没有上下文无关语法。我最近还了解到gcc 曾经使用 yacc 来解析 C。yacc 实用程序的手册指出“[yacc] 接受的规范类别是非常通用的:具有消歧规则的 LALR(1) 语法”,而维基百科指出LALR 语法是确定性上下文无关语法的子集,它们是上下文无关语法的子集。如果 C 甚至不是上下文无关的(更不用说确定性上下文无关语言),但 yacc 可以解析 C,那么 yacc 可以解析什么类语言(如果不是具有 LALR(1) 的上下文无关语言的子集)语法?
假设我有一个包含以下内容的 C 源代码文件:
int i = 21 + 10;
int blah(){
int i = 21;
return i + 10;
}
main(){
int i;
i += i + 10;
}
Run Code Online (Sandbox Code Playgroud)
词法分析阶段结束时,符号表的内容是什么?是否会有多个条目i,或者10词法分析器是否仅放置唯一值?
据我了解,令牌流将包含出现的所有令牌,但我不确定符号表。