黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Lex 編譯器入門

系統(tǒng) 3437 0
Lex工具
-------
Lex工具是一種詞法分析程序生成器,它可以根據(jù)詞法規(guī)則說明書的要求來生成單詞識別程序,由該程序識別出輸入文本中的各個單詞。
1 、lex程序的結(jié)構(gòu)

-定義部分
-規(guī)則部分
-用戶子程序部分

其中規(guī)則部分是必須的,定義和用戶子程序部分是任選的。

(
1 )?定義部分
定義部分起始于
" %{ " 符號,終止于 " %} " 符號,其間可以是包括include語句、聲明語句在內(nèi)的C語句。
%{
#include?
" stdio.h "
#include?
" y.tab.h "
extern?int?lineno
;
%}

(
2 )?規(guī)則部分
規(guī)則部分起始于
" %% " 符號,終止于 " %% " 符號,其間則是詞法規(guī)則。詞法規(guī)則由模式和動作兩部分組成。模式部分可以由任意的正則表達式組成,動作部分是由C語言語句組成,這些語句用來對所匹配的模式進行相應(yīng)處理。需要注意的是,lex將識別出來的單詞存放在yytext? [] 字符數(shù)據(jù)中,因此該數(shù)組的內(nèi)容就代表了所識別出來的單詞的內(nèi)容。

%%
[ ] ?{ ; }
[ 0-9 ] +.? [ 0-9 ] *. [ 0-9 ] +
{?sscanf(yytext
, " %1f " , ?&yylval.val) ;
return?NUMBER ; ?}
?{?lineno++ ; return?'' '';?}
.?{?return?yytex+ [ 0 ] ; ?}
%%

(
3 )?用戶子程序部分
用戶子程序部分可以包含用C語言編寫的子程序,而這些子程序可以用在前面的動作中,這樣就可以達到簡化編程的目的。下面是帶有用戶子程序的lex程序片段。
" /* " ?skipcmnts() ;
.?/*?rest?of?rules?*/
%%
skipcmnts()
{
for?(?
; ?;?)
{
while?(input()!
= ''*'') ;
if(input()! = ''/'')
unput(yytext
[ yylen-1 ] ) ;
else?return ;
}?

?以上是這個工具的簡要說明。

我在這里以《編譯原理》(龍書)的習題為例,
3.11 編寫一個Lex程式,該程式復制一個文件,并將每一個非空的空白符序列用一個空格代替。
首先,這個“非空的空白符序列”是指由空格和制表符號組成的序列,其正則表達式是[ \t],大家注意在前面有一個空格。
再則就是做一個替換操作了。

代碼為:

%{
#include?
" stdio.h "
%}

delim????
[ ? ]
ws????{delim}+

%%
{ws}?printf(
" ? " ) ;
.?printf( " %c " , yytext [ 0 ] ) ;
%%

存為? P3-11.l
編譯過程
lex P3-11.l
cc -c lex.yy.c
cc lex.yy.o -ll -o run

使用過程
run < in.txt
輸入文件內(nèi)容

I?am?????a?best?player???in?the???world ,
And?????????I??am?very????sorry?????to?trouble?you.

Hehe.


輸出結(jié)果為

I?am?a?best?player?in?the?world ,
And?I?am?very?sorry?to?trouble?you.

Hehe.


最后我提供一個腳本,方便編譯。
我的系統(tǒng)環(huán)境是
Ubuntu 7.10
flex 2.5.33

安裝Lex過程
sudo apt-get install flex

# ?Copyright?(C)?2003-2008?Wang?Pengcheng?<wpc0000@gmail.com>
#!/usr/bash

lex?$ 1 ?
cc?
- c?lex . yy . c
cc?lex
. yy . o? - ll? - o?run
rm?lex
. yy .*
rm?
*~

?

Lex 編譯器入門


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論