1. 控制参数
1.1.命令行参数
d 输出单独的定义文件
h 打印帮助信息
l 在生成的代码中生成#line
t 在生成的代码中将YYDEBUG使能
v 将分析过程中的详细信息输出到output文件中
y 将输出文件设置为y.c
V 输出本语法分析器的版本号
-o file_name 指定输出文件名
-p name 指定生成代码中各名字的前缀
1.2.语法文件中的选项
%define输出单独的定义文件
%no-line %no_line % no line不在生成的代码中生成#line
%debug在生成的代码中将YYDEBUG使能
%verbose将分析过程中的详细信息输出到output文件中
%output file_name 指定输出文件名
%name-prefix %name_prefix %name prefix指定生成代码中各名字的前缀
%skeleton file_name 指定框架文件
2. 词法分析的算法问题
2.1.识别字符串
/"[^"/n]* {
if (0 == yy_hold_char || '/n' == yy_hold_char) {
warn_at("unterminate string");
input();
yylval.chars = add_string(yytext + 1);
return string_content;
} else if ('//' == yytext[yyleng-1]) {
yymore();
} else {
input();
yylval.chars = add_string(yytext + 1);
return string_content;
} }
将字符串分成多个段,每次识别一段,并调用yymore继续识别剩余部分。遇到转义的双引号时将字符串分成两段,前面一段包含转义符,后面一段包含双引号,后面一段本身就是一个完整的字符串。此规则不能识别分成多行的字符串,如果要识别多行的字符串,必须解决超长字符串的问题。
2.2.识别注释
支持C语义中两种注释。
双斜杠开始的注释比较好识别,使用模式”//”.*即可。
对于斜杠加星的字符串,应该用独立的模式。扫描YACC规则时可能进入注释模式,扫描C代码时也可能进入注释模式,进入注释模式钱,应该记住当前的模式,以便返回正确的模式。
“/*” context_state = YY_START; BEGIN SC_COMMENT;
<SC_COMMENT> “*/” BEGIN context_state 退出注释状态
<SC_COMMENT> .|/n 跳过一切字符,遇到换行时将行号加一
<SC_COMMENT> <<EOF>> 打印告警并退出注释状态
2.3.识别YACC的三个部分
YACC源程序分三个部分,中间用顶行写的%%分割,后面可以跟其它任何字符,但这些字符都将被忽略。这三个部分文法规则差异很大,