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

Lex和Yacc從入門(mén)到精通(3) - 一個(gè)極其簡(jiǎn)單的lex和yacc程序

原文地址

摘要

在本章中,將會(huì)首先給出一個(gè)最基本的lex和yacc聯(lián)合使用的框架,這個(gè)基本框架最主要的特點(diǎn)就是能夠正確的被編譯。在我學(xué)習(xí)lex和yacc的過(guò)程中經(jīng)歷了無(wú)數(shù)次的痛苦折磨,我發(fā)現(xiàn)一個(gè)一開(kāi)始足夠簡(jiǎn)單而且能夠被正確編譯的例子往往能夠使 學(xué)習(xí)者增加學(xué)習(xí)的興趣和信心。因此我的所有的文章都盡可能的采用這種方式進(jìn)行描述。我寫(xiě)這些文檔的最大的愿望就是希望能夠減少新手學(xué)習(xí)的痛苦。希望自 己能夠做到這一點(diǎn)!

例 3.1. frame.l

 

%{
int yywrap( void );
%}
%%
%%
int yywrap( void )
{
return 1;
}

lex文件和yacc文件都是被%%分成了上中下三個(gè)部分,在這個(gè)程序中的yywrap函數(shù) 需要說(shuō)明一下:

yywrap
lex源文件中的yywrap函數(shù)是必須的!具體的原因就是因?yàn)榻o了這個(gè)函數(shù)實(shí) 現(xiàn)之后就可以不需要依賴(lài)flex庫(kù)了。具體yywrap的作用會(huì)在后面的章節(jié)應(yīng) 用的時(shí)候進(jìn)行解釋。通常的做法就是直接返回1,表示輸入已經(jīng)結(jié)束了。

例 3.2. frame.y

 

%{
void yyerror( const char *s);
%}
%%
program:
;
%%
void yyerror( const char *s)
{
}
int main()
{
yyparse();
return 0;
}

如前所述,yacc文件被%%分成了上中下三個(gè)部分,在這個(gè)程序中有幾個(gè)需要說(shuō)明 的地方:

program
這是語(yǔ)法規(guī)則里面的第一個(gè)非終結(jié)符,注意上面的格式哦:“program”后面緊跟著一個(gè)冒號(hào)“:”,然后換行之后有一個(gè)分號(hào)“;”,這表明這個(gè) program是由空串組成的。至于什么是非終結(jié)符以及什么是終結(jié)符,還有什么是語(yǔ)法規(guī)則都會(huì)在后面的章節(jié)中進(jìn)行詳細(xì)介 紹。
yyerror
從字面上就可以看出是一個(gè)處理錯(cuò)誤的函數(shù),在這里為空的原因是為了保 證代碼盡可能的簡(jiǎn)潔! 實(shí)際上這個(gè)函數(shù)里面的代碼通常只有一句輸出語(yǔ)句 ,當(dāng)然如果你喜歡還可以加入糾錯(cuò)代碼,使你的解析器具備糾錯(cuò)能力:)
yyparse
其實(shí)這個(gè)函數(shù)是yacc生成的,所以你在代碼里面可以直接使用。這個(gè)時(shí)候你可能會(huì)問(wèn):“yacc生成了yyparse函數(shù),那么lex是不是也生成了什么函數(shù)呢?”,是的,lex生成的函數(shù)為yylex函數(shù)。實(shí)際上yyparse還間接調(diào)用 了yylex函數(shù),可以在生成的C源文件中去核實(shí)。
main
每一個(gè)C/C++程序都必須的裝備啊,少了怎么能行呢:)所以這個(gè)main函數(shù)你 可以放到任何的地方,當(dāng)然要保證能夠調(diào)用yyparse就可以了。但是通常的 做法就是將main函數(shù)放到y(tǒng)acc文件中。

從上面的yacc文件中還可以看出被%%分割成為的三個(gè)部分,第一部分中要寫(xiě)入 C/C++代碼必須用%{和%}括起來(lái);但是第三個(gè)部分就可以直接寫(xiě)入C/C++代碼了,不需要任何的修飾;中間的那一部分就是yacc語(yǔ)法規(guī)則了。為了能夠讓這個(gè)最最簡(jiǎn)單的yacc源程序能夠通過(guò)bison的編譯必須要提供一個(gè)語(yǔ)法規(guī)則,這里給出了一個(gè)最簡(jiǎn)單的規(guī)則:一個(gè)program就是由空字符串構(gòu)成的。實(shí)際上等于什么也沒(méi)有做。呵呵,對(duì)啊,本章的目的就是為了能夠編譯通過(guò)lex和yacc源程序,并且也能夠被C/C++編譯器編譯通過(guò)啊。現(xiàn)在是不是已經(jīng)真的編譯通過(guò)了呢 ,可以按照下面的編譯步驟一步一步的來(lái)編譯核實(shí)。

提示

對(duì)yacc的描述同樣也適用于lex。

lex就是詞法掃描器,yacc就是語(yǔ)法分析器,這是通用的說(shuō)法;具體的實(shí)現(xiàn)有所 不同GNU的lex就是flex,GNU的yacc就是bison。為了統(tǒng)一,所以在后面的文章 中就只會(huì)用lex來(lái)表達(dá)詞法掃描器,用yacc來(lái)表達(dá)語(yǔ)法分析器啦!

下面是編譯全過(guò)程記錄,采用了我在第一章中所制作的lex和yacc轉(zhuǎn)換環(huán)境:

 

D:\work\lex_yacc\chapter03>dir
驅(qū)動(dòng)器 D 中的卷是 工作區(qū)
卷的序列號(hào)是 54D0-5FC0

D:\work\lex_yacc\chapter03 的目錄

2006-09-25 20:27 <DIR> .
2006-09-25 20:27 <DIR> ..
2006-09-25 20:07 71 frame.l
2006-09-25 20:20 144 frame.y
2 個(gè)文件 215 字節(jié)
2 個(gè)目錄 7,785,578,496 可用字節(jié)

D:\work\lex_yacc\chapter03>flex frame.l

D:\work\lex_yacc\chapter03>dir
驅(qū)動(dòng)器 D 中的卷是 工作區(qū)
卷的序列號(hào)是 54D0-5FC0

D:\work\lex_yacc\chapter03 的目錄

2006-09-25 20:28 <DIR> .
2006-09-25 20:28 <DIR> ..
2006-09-25 20:07 71 frame.l
2006-09-25 20:20 144 frame.y
2006-09-25 20:28 36,997 lex.yy.c
3 個(gè)文件 37,212 字節(jié)
2 個(gè)目錄 7,785,537,536 可用字節(jié)

D:\work\lex_yacc\chapter03>bison -d frame.y

D:\work\lex_yacc\chapter03>dir
驅(qū)動(dòng)器 D 中的卷是 工作區(qū)
卷的序列號(hào)是 54D0-5FC0

D:\work\lex_yacc\chapter03 的目錄

2006-09-25 20:28 <DIR> .
2006-09-25 20:28 <DIR> ..
2006-09-25 20:07 71 frame.l
2006-09-25 20:28 19,416 frame.tab.c
2006-09-25 20:28 74 frame.tab.h
2006-09-25 20:20 144 frame.y
2006-09-25 20:28 36,997 lex.yy.c
5 個(gè)文件 56,702 字節(jié)
2 個(gè)目錄 7,785,517,056 可用字節(jié)

D:\work\lex_yacc\chapter03>

過(guò)程 3.1. 總的來(lái)說(shuō)就是如下的幾個(gè)步驟:

  1. 將前面的例子frame.lframe.y保存成為相應(yīng)的文件
  2. flex frame.l
  3. bison frame.y
  4. gcc frame.tab.c lex.yy.c

提示

實(shí)際上經(jīng)過(guò)flex和bison的轉(zhuǎn)換之后的C/C++源程序是可以直接在VC里面使用的!

上面的frame.tab.c是由bison編譯frame.y產(chǎn)生的,而lex.yy.c則是由flex編譯 frame.l產(chǎn)生的。

好了,一個(gè)最簡(jiǎn)單的lex和yacc程序已經(jīng)完備了,因此這一章的目的也就已經(jīng)達(dá)到了。在下一章里面將會(huì)對(duì)這里的框架例子進(jìn)行擴(kuò)充以適應(yīng)自己特殊的需要,逐步逐步的實(shí)現(xiàn)一個(gè)分析C/C++源代碼的工具程序,但是每一章的結(jié)尾都會(huì)盡可能的給出一個(gè)可以編譯通過(guò)的lex和yacc源程序。本來(lái)也想給出一個(gè)計(jì)算器的源程序作為例子的,但是這樣的資料已經(jīng)很多了。這些資料往往不能夠讓自己說(shuō)清楚問(wèn)題,在自己的開(kāi)發(fā)中還是會(huì)遇到千奇百怪的問(wèn)題,因此為了讓自己能夠有機(jī)會(huì)解決一個(gè)新手在開(kāi)發(fā)新程序中可能出現(xiàn)的問(wèn)題,我也就找了一個(gè)我沒(méi)有開(kāi)發(fā)過(guò)的程序來(lái)讓自己一步一步的解決這些問(wèn)題 。我想這種方式也許是比較好的學(xué)習(xí)方式吧:)


posted on 2008-02-03 17:59 FongLuo 閱讀(359) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導(dǎo)航

常用鏈接

留言簿

隨筆分類(lèi)(11)

隨筆檔案(79)

文章檔案(1)

收藏夾(38)

學(xué)習(xí)網(wǎng)站

一般網(wǎng)站

最新隨筆

搜索

積分與排名

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲乱码一区二区| 在线精品视频在线观看高清 | 日韩午夜一区| 亚洲免费一在线| 国产欧亚日韩视频| 久久婷婷综合激情| 日韩午夜电影| 久久激情五月激情| 亚洲人成网站影音先锋播放| 欧美日韩激情网| 欧美一区二区三区另类| 欧美粗暴jizz性欧美20| 亚洲淫片在线视频| 一区视频在线看| 欧美色精品在线视频| 校园春色综合网| 亚洲激情影院| 欧美一级专区免费大片| 亚洲国产成人精品久久久国产成人一区 | 国产一区二区三区四区三区四| 久久久女女女女999久久| 亚洲经典在线| 久久久久久亚洲精品杨幂换脸 | 欧美高清日韩| 午夜视频在线观看一区| 亚洲国产精品久久久| 国产精品理论片| 欧美/亚洲一区| 亚洲欧美清纯在线制服| 亚洲高清视频一区二区| 久久国产日韩欧美| 99re66热这里只有精品4| 好吊色欧美一区二区三区视频| 欧美日韩不卡合集视频| 久久久久国色av免费看影院| 亚洲性色视频| 亚洲区免费影片| 六月天综合网| 久久电影一区| 亚洲天堂免费在线观看视频| 91久久精品国产91久久性色| 国产一区二区av| 国产精品久久午夜| 欧美区在线观看| 免费在线看一区| 久久久夜精品| 久久黄色小说| 午夜精品一区二区三区四区| 一级日韩一区在线观看| 91久久精品国产91久久性色tv | 91久久久久久久久| 国产在线拍偷自揄拍精品| 国产精品扒开腿做爽爽爽软件| 欧美国产极速在线| 久久综合色天天久久综合图片| 欧美一级免费视频| 亚洲免费在线视频| 亚洲一区二区精品| 99这里只有久久精品视频| 亚洲日本中文| 亚洲日本欧美| 日韩一区二区福利| 亚洲美女在线观看| 一本不卡影院| 在线视频一区二区| 在线视频精品| 在线亚洲一区二区| 亚洲一区二区成人在线观看| 亚洲小视频在线| 亚洲一区二区三区四区五区黄| 亚洲无限av看| 性欧美xxxx视频在线观看| 亚洲欧美日韩在线不卡| 香蕉久久夜色精品国产使用方法| 亚洲欧美日韩国产精品| 欧美一区二区在线免费观看| 欧美一区二区三区四区在线| 久久精品一区四区| 免费在线国产精品| 欧美—级在线免费片| 欧美三级电影网| 国产精品入口福利| 国产在线播精品第三| 在线成人h网| 亚洲日本中文字幕| 亚洲午夜激情| 久久精品在线| 欧美大片91| 亚洲精品日韩激情在线电影| 亚洲天堂男人| 久久国产日韩| 欧美99久久| 国产精品高潮粉嫩av| 国产亚洲制服色| 亚洲精品国产精品久久清纯直播| 一本久道综合久久精品| 午夜免费电影一区在线观看| 久久精品久久综合| 亚洲国产精品va在线看黑人| 中文精品在线| 久久久久国产免费免费| 欧美另类久久久品| 国产日产欧美a一级在线| 亚洲成人自拍视频| 亚洲一区二区少妇| 久久美女性网| 99riav久久精品riav| 久久黄色网页| 欧美日韩视频在线一区二区观看视频 | 夜夜嗨av一区二区三区网站四季av| 亚洲欧美精品一区| 免费观看欧美在线视频的网站| 欧美体内she精视频在线观看| 韩日午夜在线资源一区二区| 一本到高清视频免费精品| 久久国产精品高清| 亚洲国产影院| 欧美中文在线观看国产| 欧美日韩国产精品一区二区亚洲| 国产真实精品久久二三区| 99精品免费| 美女精品网站| 亚洲欧美综合另类中字| 欧美精品激情在线观看| 韩国精品在线观看| 亚洲欧美一级二级三级| 亚洲国产成人精品久久久国产成人一区 | 99精品国产一区二区青青牛奶| 久久精品一本| 中日韩美女免费视频网址在线观看| 久久亚洲捆绑美女| 国产亚洲精品久久久| 亚洲图片激情小说| 亚洲国产美女精品久久久久∴| 欧美一区免费| 国产精品一国产精品k频道56| 一区二区三区.www| 欧美激情综合色| 久久视频一区| 国产视频欧美视频| 性欧美1819sex性高清| 亚洲乱码视频| 欧美精品二区三区四区免费看视频| 樱桃视频在线观看一区| 久久精品二区亚洲w码| 亚洲视频欧洲视频| 欧美揉bbbbb揉bbbbb| 99成人在线| 亚洲国产电影| 欧美刺激性大交免费视频| 在线欧美日韩| 欧美成人午夜| 美女网站久久| 亚洲国产精品第一区二区| 久热综合在线亚洲精品| 久久成人一区| 极品日韩av| 男人插女人欧美| 美女啪啪无遮挡免费久久网站| 亚洲二区在线观看| 欧美激情五月| 欧美精品在线免费| 夜夜嗨av一区二区三区四季av| 91久久久在线| 欧美日韩亚洲一区二区三区在线| 一本久久综合| 中文av字幕一区| 国产日韩成人精品| 久久久91精品国产一区二区三区| 欧美一区二区高清| 一区精品在线| 欧美好骚综合网| 欧美日本在线看| 亚洲欧美在线一区二区| 亚洲欧美激情四射在线日| 国产性天天综合网| 欧美mv日韩mv国产网站| 欧美成年网站| 亚洲欧美美女| 欧美在线关看| 亚洲欧洲日产国产网站| 日韩视频在线免费观看| 国产精品美女一区二区在线观看| 久久精品国产精品亚洲| 久久天堂国产精品| 一本久道综合久久精品| 亚洲专区一区| 亚洲电影第1页| 洋洋av久久久久久久一区| 国产精品亚洲综合一区在线观看| 久久先锋资源| 欧美精品一线| 欧美亚洲视频| 欧美成人在线网站| 午夜视频一区二区| 久久一二三区| 亚洲欧美久久久久一区二区三区| 久久超碰97中文字幕| 日韩视频免费| 欧美亚洲一区二区在线|