自己写语法分析生成器

 

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源程序分三个部分,中间用顶行写的%%分割,后面可以跟其它任何字符,但这些字符都将被忽略。这三个部分文法规则差异很大,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值