正在加载图片...
这是语法规则里面的第一个非终结符,注意上面的格式哦:“prog肛am” 后面紧跟若一个冒号“:”,然后换行之后有一个分号“: ,这表明这 人 是由空串组成的。至 什么是非终结符以及什么是终结符, 还有什么是语法规则都会在后面的章节中进行详细介绍。 yyerror 从字面上就可以看出是一个处理错误的函数,在这里为空的原因是为了保 证代码尽可能的简洁!实际上这个函数里面的代码通常只有一句输出语 句,当然如果你喜欢还可以加入纠错代码,使你的解析器具备纠错能力:) yyparse 其实这个函数是yacc生成的,所以你在代码里面可以直接使用。这个时 候你可能会问:“yacc生成了yyparse函数,那么lex是不是也生成了 什么函数呢?”,是的,lex生成的函数为yylex函数。实际上yyparse 还间接调用了yylex函数,可以在生成的C源文件中去核实。 main 每一个C/C+程序都必须的装备啊 少了怎么能行呢:)所以这个main函 数你可以放到任何的地方,当然要保证能够调用yyparse就可以了。但 是通常的做法就是将main函数放到yacc文件中。 从上面的ycc文件中还可以看出被%分割成为的三个部分,第一部分中要写入 C/C++代码必须用%和%}括起来:但是第三个部分就可以直接写入C/C++代码 ,不需要任何的修饰:中间的那一部分就是】 cc语法规则了。为了能够让这 个最最简单 源程序能够通过bison的编译必须要提供 个语法 则,这 里给出了一 最简单的规则:一个program就是由空字符串构成的。实际上等于 什么也没有做。呵呵,对啊,本章的目的就是为了能够编译通过lex和yacc源 程序,并且也能够被C/C+编译器编译通过啊。现在是不是己经真的编译通过 了呢,可以按照下面的编译步骤一步一步的来编译核实。 提示 对yacc的描述同样也适用于lex。 lex就是词法扫描器,yacc就是语法分析器,这是通用的说法:具体的实现有所 不同GNW的lex就是flex,GNWU的yacc就是bison。为了统一,所以在后面的 文章中就只会用lex来表达词法扫描器,用yacc来表达语法分析器啦! 3.用C语言编译器编译这 是语法规则里面的第一个非终结符,注意上面的格式哦:“program” 后 面紧跟着一个冒号“:”,然后换行之后有一个分号“;”,这表明这 个 program 是由空串组成的。至于什么是非终结符以及什么是终结符, 还有什 么是语法规则都会在后面的章节中进行详细介 绍。 yyerror 从字面上就可以看出是一个处理错误的函数,在这里为空的原因是为了保 证代码尽可能的简洁! 实际上这个函数里面的代码通常只有一句输出语 句 ,当然如果你喜欢还可以加入纠错代码,使你的解析器具备纠错能力:) yyparse 其 实这个函数是 yacc 生成的,所以你在代码里面可以直接使用。这个时 候 你可能会问:“yacc 生成了 yyparse 函数,那么 lex 是不是也生成了 什么函 数呢?”,是的,lex 生成的函数为 yylex 函数。实际上 yyparse 还间接调用 了 yylex 函数,可以在生成的 C 源文件中去核实。 main 每一个 C/C++程序都必须的装备啊,少了怎么能行呢:)所以这个 main 函 数你 可以放到任何的地方,当然要保证能够调用 yyparse 就可以了。但 是通常的 做法就是将 main 函数放到 yacc 文件中。 从 上面的 yacc 文件中还可以看出被%%分割成为的三个部分,第一部分中要写入 C/C++代码必须用%{和%}括起来;但是第三个部分就可以直接写入 C/C++代码 了 ,不需要任何的修饰;中间的那一部分就是 yacc 语法规则了。为了能够让这 个 最最简单的 yacc 源程序能够通过 bison 的编译必须要提供一个语法规则,这 里给出了一个最简单的规则:一个 program 就是由空字符串构成的。实际上等于 什么也没有做。呵呵,对啊,本章的目的就是为了能够编译通过 lex 和 yacc 源 程 序,并且也能够被 C/C++编译器编译通过啊。现在是不是已经真的编译通过 了呢 ,可以按照下面的编译步骤一步一步的来编译核实。 提示 对 yacc 的描述同样也适用于 lex。 lex 就是词法扫描器,yacc 就是语法分析器,这是通用的说法;具体的实现有所 不同 GNU 的 lex 就是 flex,GNU 的 yacc 就是 bison。为了统一,所以在后面的 文章 中就只会用 lex 来表达词法扫描器,用 yacc 来表达语法分析器啦! 3. 用 C 语言编译器编译
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有