青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

yacc學習筆記(3) 2014.04.11

Posted on 2014-04-10 09:43 S.l.e!ep.¢% 閱讀(1947) 評論(0)  編輯 收藏 引用 所屬分類: yacc
實現解析c++ #include 頭文件的語法, 暫時沒有實現 嵌套解析 #include

codegen.l
%option?noyywrap
%option?yylineno

%{
#include?
<stdio.h>
#include?
<stdlib.h>
#include?
"codegen.tab.h"
#define?YYDEBUG?0?//?將這個變量設置為1則表示啟動Yacc的調試功能

#define?YYERROR_VERBOSE

extern?int?yylex();
extern?void?yyerror(char*?s);

%}

%x?_STATE_INCLUDE_
%x?_STATE_INCLUDE_FILE_

%%

"#"[?\t]*"include"?{?
????????BEGIN?_STATE_INCLUDE_;??
//?進入?_STATE_INCLUDE_?狀態
????????return?TOKEN_INCLUDE;
????}

<_STATE_INCLUDE_>[/"|<]*?{
????????BEGIN?_STATE_INCLUDE_FILE_;?//?進入?_STATE_INCLUDE_FILE_?狀態
????????return?*yytext;?//?返回引號或尖括號
????}
????
<_STATE_INCLUDE_FILE_>[/"|>]?{
????????return?TOKEN_INCLUDE_FILE;?//?返回頭文件標記
????};
????
[?
/t/n]?;?//?對于額外的空白不處理
%%
int?main(?int?argc,?char?**argv?)
{
????yyparse();
}
void?yyerror(char?*s)
{
????fprintf(stderr,?
"error:?%s\n",?s);
}

codegen.y
%{
#include?
<stdio.h>
#include?
<stdlib.h>
%}

%token?TOKEN_INCLUDE?
%token?TOKEN_INCLUDE_FILE

%%

program:
????
|?program?include_process
????;

include_process:
????TOKEN_INCLUDE?
'<'?TOKEN_INCLUDE_FILE?'>'?
????{
????????printf(
"include?=?[%s]?\n",?$3?);
????}
????
|?TOKEN_INCLUDE?'/"'?TOKEN_INCLUDE_FILE?'/"'
????{
????????printf(
"include?=?[%s]?\n",?$3?);????????
????}
????
%%

---------------------------------------------------
2014.04.11
上面的解析是有問題的, 當輸入 #include <abc> 時,解析結果為空, 看了下書, 原因是在 返回 TOKEN_INCLUDE_FILE 標記時, 沒有對 全局變量 yylval 進行賦值
yylval 是一個int 的類型, 在bison生成的代碼, yylval是用 YYSTYPE 定義的,可以通過 %union 修改 YYSTYPE 的定義

修改后的代碼如下:
codegen.l
%option?noyywrap
%option?yylineno

%{
#include?
<stdio.h>
#include?
<stdlib.h>
#include?
"codegen.tab.h"
#define?YYDEBUG?1?//?將這個變量設置為1則表示啟動Yacc的調試功能

#define?YYERROR_VERBOSE

extern?int?yylex();
extern?void?yyerror(char*?s);

%}

%x?_STATE_INCLUDE_BEGIN_
%x?_STATE_INCLUDE_FILE_
%x?_STATE_INCLUDE_END_

%%

^"#include"?{?
????????BEGIN?_STATE_INCLUDE_BEGIN_;
????????
return?TOKEN_INCLUDE;
????}

<_STATE_INCLUDE_BEGIN_>"<"?{
????????BEGIN?_STATE_INCLUDE_FILE_;
????????
return?'<';
????}
????
<_STATE_INCLUDE_FILE_>[^\">]+?{
????????BEGIN?_STATE_INCLUDE_END_;
????????yylval.m_lpStr?
=?strdup(yytext);
????????
return?TOKEN_INCLUDE_FILE;
????}
????
<_STATE_INCLUDE_END_>">"?{
????????
return?'>';
????}

[?
/t/n]?;?//?對于額外的空白不處理

.?{?printf(
"other");?}
%%
int?main(?int?argc,?char?**argv?)
{
????yyparse();
}
void?yyerror(char?*s)
{
????fprintf(stderr,?
"error:?%s\n",?s);
}

codegen.y
%{
#include?
<stdio.h>
#include?
<stdlib.h>

%}

%union
{
?????
char*?m_lpStr;
}

%token?TOKEN_INCLUDE
%token?TOKEN_INCLUDE_FILE

%%

program:
????
|?program?include_process
????;

include_process:
????TOKEN_INCLUDE?
'<'?TOKEN_INCLUDE_FILE?'>'
????{
????????printf(
"include?=?[%s]?\n",?yylval.m_lpStr?);
????????free(?yylval.m_lpStr?);
????}
????
%%

修改后的問題
1. 輸出時多了一個空格 和 換行
2. 實現一個 include 解析, 需要這么多的獨占狀態么?

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成亚洲人成在线观看| 亚洲美女免费精品视频在线观看| 亚洲精品国产精品国自产观看| 久久久国产成人精品| 亚欧美中日韩视频| 红桃视频一区| 欧美电影免费观看高清| 欧美成人免费在线观看| 一区二区三区你懂的| 一区二区日韩欧美| 国产一区二区三区精品欧美日韩一区二区三区 | 午夜在线电影亚洲一区| 国产在线欧美日韩| 欧美激情第9页| 欧美日韩国产小视频| 欧美系列电影免费观看| 性欧美xxxx视频在线观看| 久久国产毛片| 亚洲精品永久免费精品| 亚洲小少妇裸体bbw| 激情久久五月| 99视频在线精品国自产拍免费观看 | 亚洲欧美日韩一区二区| 在线不卡欧美| 一二三区精品| 在线看片欧美| 亚洲一二三区视频在线观看| 伊人成综合网伊人222| 亚洲毛片在线观看| 黄色亚洲精品| 夜夜爽av福利精品导航| 影音先锋亚洲视频| 亚洲网站在线观看| 亚洲精品精选| 久久精品国产清高在天天线| 在线性视频日韩欧美| 久久久久久久久久久久久女国产乱 | 亚洲免费在线看| 美女视频黄免费的久久| 欧美亚洲一级片| 欧美日韩爆操| 欧美成人免费网站| 国产视频精品va久久久久久| 亚洲精品九九| 亚洲国产欧美另类丝袜| 欧美一区2区视频在线观看| 亚洲一区免费看| 欧美精品三级| 欧美国产高清| 亚洲福利视频网站| 久久久精品国产免大香伊| 亚洲欧美在线aaa| 欧美视频中文一区二区三区在线观看| 久久综合中文字幕| 国产一区二区三区在线播放免费观看| 亚洲美女在线国产| 日韩一级二级三级| 欧美成人综合在线| 欧美成人伊人久久综合网| 伊人蜜桃色噜噜激情综合| 亚洲欧美日韩一区在线| 欧美在线免费一级片| 国产精品中文字幕在线观看| 亚洲特色特黄| 香蕉久久久久久久av网站| 国产精品久久999| 亚洲性感激情| 性欧美videos另类喷潮| 国产日本精品| 欧美在线观看www| 久久久久久色| 在线精品视频免费观看| 久久久无码精品亚洲日韩按摩| 久久久久久久久一区二区| 黄色工厂这里只有精品| 久久野战av| 亚洲精品在线观| 欧美日韩高清在线播放| 一本大道久久a久久精二百| 亚洲一区二区在| 国产精品毛片一区二区三区 | 亚洲美女中出| 午夜精品成人在线视频| 国产日韩欧美一区二区| 久久精品视频导航| 亚洲片区在线| 欧美亚洲日本网站| 黄色成人91| 欧美人在线视频| 亚洲欧美制服另类日韩| 蜜臀va亚洲va欧美va天堂 | 国产精品久久久久91| 欧美一级播放| 亚洲国产高清一区| 西西裸体人体做爰大胆久久久| 国产真实精品久久二三区| 麻豆成人在线| 亚洲手机成人高清视频| 久久噜噜噜精品国产亚洲综合| 亚洲国产成人久久| 国产精品久久9| 另类国产ts人妖高潮视频| 夜色激情一区二区| 久久综合狠狠综合久久激情| 一区二区欧美视频| 国产日本欧美一区二区三区| 麻豆精品国产91久久久久久| 中文av字幕一区| 欧美电影免费| 久久精品国产2020观看福利| 亚洲黄色免费电影| 国产亚洲精品aa| 欧美日韩国语| 久久久一二三| 午夜精品久久久久久久久 | 欧美黄色aa电影| 欧美在线观看你懂的| 一本久久青青| 亚洲国产精品久久久久秋霞蜜臀 | 国产综合欧美在线看| 欧美午夜精品伦理| 欧美激情亚洲一区| 久久久久久一区二区| 午夜免费在线观看精品视频| 亚洲免费激情| 亚洲人成在线观看| 欧美sm视频| 老鸭窝毛片一区二区三区| 午夜一区二区三区不卡视频| 一区二区三区视频在线观看| 亚洲国产精品一区| 精品二区久久| 狠色狠色综合久久| 国内精品视频一区| 国产日产精品一区二区三区四区的观看方式| 欧美激情在线观看| 欧美aaa级| 另类尿喷潮videofree | 亚洲一区二区三区中文字幕| 99re6热只有精品免费观看| 亚洲欧洲精品一区二区精品久久久| 免费成人在线视频网站| 蜜桃av一区| 欧美国产一区二区| 亚洲精品一品区二品区三品区| 在线观看91精品国产入口| 伊人久久大香线蕉av超碰演员| 国内伊人久久久久久网站视频| 国模叶桐国产精品一区| 国产亚洲欧美一区| 激情亚洲一区二区三区四区| 一区二区三区在线视频观看| 在线免费观看日本一区| 亚洲国产第一| 99精品欧美一区| 亚洲一区二区在线看| 欧美有码在线视频| 久久综合伊人77777麻豆| 欧美成人高清| 欧美黄色网络| 亚洲第一在线视频| 亚洲国产二区| 一区二区三区久久精品| 亚洲视频999| 亚洲欧美日韩成人高清在线一区| 小黄鸭精品密入口导航| 性欧美videos另类喷潮| 欧美中文日韩| 欧美日韩国产区| 欧美四级电影网站| 国产精品综合av一区二区国产馆| 亚洲美女av电影| 久久不射中文字幕| 久久夜色精品国产亚洲aⅴ| 美女在线一区二区| 欧美精品在线观看一区二区| 欧美四级剧情无删版影片| 国产欧美日韩激情| 国产精品日韩精品欧美精品| 亚洲第一中文字幕| 一个色综合导航| 欧美亚洲专区| 亚洲国产综合在线| 亚洲视频免费观看| 欧美中文字幕| 亚洲欧美久久久久一区二区三区| 久久婷婷丁香| 欧美日韩一区二区三区四区在线观看 | 欧美国产日本高清在线| 亚洲七七久久综合桃花剧情介绍| 亚洲人体大胆视频| 久久精品中文字幕免费mv| 免费精品视频| 国产精品久久午夜夜伦鲁鲁| 国产日韩欧美在线播放| 影音先锋日韩精品| 亚洲精品视频在线| 欧美一区二区精美| 亚洲国产婷婷综合在线精品| 亚洲欧美日本国产专区一区|