[原理] Lex Yacc規(guī)則格式

歷史

  • 在1975年之前瑞筐,寫出一個編譯器是很麻煩的事情何缓。 在1975年的時候,有兩篇文章的發(fā)表冒版,簡化了編譯器的編寫液茎。
    Lex - A Lexical Analyzer Generator.
    Yacc: Yet Another Compiler Compiler.
  • Lex和YACC的具體實現(xiàn)細(xì)節(jié)可以在2006年的這本書中找到:
    Compilers, Principles, Techniques and Tools (2nd edition). Addison-Wesley, Reading, Massachusetts.
  • WinFlex和WinBison是Flex和Bison的Windows版本。


    image.png

編譯順序

  • Lex的輸入:詞法規(guī)則(.l文件)
  • Lex的輸出:詞法分析器
  • Yacc的輸入:語法規(guī)則(.y文件)
  • Yacc的輸出:語法分析器
  • 宿主程序使用詞法分析器和語法分析器辞嗡,產(chǎn)生分析結(jié)果捆等。
    image.png

規(guī)則格式

Lex匹配規(guī)則

Yacc匹配規(guī)則

Lex文件格式

Lex預(yù)定義變量

Lex代碼示例

ECHO

LineNo

變量名

字符統(tǒng)計

Yacc文法

Yacc的語法是BNF范式的變種。BNF文法可以用來表示上下文無關(guān)文法续室,大多數(shù)的編程語言都可以用BNF來表示栋烤。


文法

文法可以擴(kuò)展的表達(dá)式

自底向上分析。默認(rèn)放一個“.”在棧里面挺狰。shift操作:一個新的標(biāo)識符入棧明郭。reduce操作:使用文法進(jìn)行規(guī)約。

Shift -Reduce沖突

例子中的第6步丰泊,E+E可以進(jìn)行Reduce薯定,但是也可以進(jìn)行Shift。使用符號結(jié)合方向和優(yōu)先級解決瞳购。

Reduce-Reduce沖突

id有兩種Reduce結(jié)果:E或者T话侄。

Yacc語法格式

語法格式

Yacc代碼示例

  • lex文件
    詞法分析器輸出的Token類型:VARIABLE,INTEGER学赛,-年堆,+,(盏浇,)变丧,=,/绢掰,\n痒蓬,a-z
  • yacc文件
    詞法標(biāo)識:INTEGER,VARIABLE
    符號優(yōu)先級與結(jié)合方式
    文法標(biāo)識:program滴劲,statement谊却,expr
    int sys[26]:a-z 26個變量的數(shù)值
  • yytext
    詞法分析器匹配到的字符串
  • yylval
    yytext相關(guān)的數(shù)值,比如:在詞法分析器匹配到數(shù)字的時候哑芹,設(shè)置yylval=atoi(yytext) 炎辨,在語法分析器,就可以通過$1聪姿,$2碴萧,來讀取對應(yīng)的yylval。
  • 實際上末购,yacc內(nèi)部有兩個棧破喻,一個是分析棧,一個是內(nèi)容棧盟榴,分別用yytext和yylval來讀取曹质。
  • Lex Yacc (一) 入門 這里說的更加詳細(xì)一些。
    Lex文件

    Yacc文件

示例使用

幾次輸入輸出

第1次輸入

下載地址

https://github.com/lexxmark/winflexbison

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羽德,隨后出現(xiàn)的幾起案子几莽,更是在濱河造成了極大的恐慌,老刑警劉巖宅静,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章蚣,死亡現(xiàn)場離奇詭異,居然都是意外死亡姨夹,警方通過查閱死者的電腦和手機(jī)纤垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磷账,“玉大人峭沦,你說我怎么就攤上這事√釉悖” “怎么了吼鱼?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長履磨。 經(jīng)常有香客問我蛉抓,道長,這世上最難降的妖魔是什么剃诅? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任巷送,我火速辦了婚禮,結(jié)果婚禮上矛辕,老公的妹妹穿的比我還像新娘笑跛。我一直安慰自己,他們只是感情好聊品,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布飞蹂。 她就那樣靜靜地躺著,像睡著了一般翻屈。 火紅的嫁衣襯著肌膚如雪陈哑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天伸眶,我揣著相機(jī)與錄音惊窖,去河邊找鬼。 笑死厘贼,一個胖子當(dāng)著我的面吹牛界酒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘴秸,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼毁欣,長吁一口氣:“原來是場噩夢啊……” “哼庇谆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凭疮,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤饭耳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哭尝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哥攘,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡剖煌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年材鹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕姊。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡桶唐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茉兰,到底是詐尸還是另有隱情尤泽,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布规脸,位于F島的核電站坯约,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莫鸭。R本人自食惡果不足惜闹丐,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望被因。 院中可真熱鬧卿拴,春花似錦、人聲如沸梨与。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粥鞋。三九已至缘挽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呻粹,已是汗流浹背壕曼。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留尚猿,地道東北人窝稿。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像凿掂,于是被迫代替她去往敵國和親伴榔。 傳聞我的和親對象是個殘疾皇子纹蝴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容