欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何理解lex和yacc

本篇文章給大家分享的是有關(guān)如何理解lex和yacc,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

我們提供的服務(wù)有:做網(wǎng)站、網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、西平ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的西平網(wǎng)站制作公司

一、背景

     從零開(kāi)始學(xué)習(xí)下lex和yacc

     1. 基礎(chǔ)

      lex只有狀態(tài)和狀態(tài)轉(zhuǎn)換,沒(méi)有棧,善于模式匹配;yacc能處理帶棧的FSA(有限狀態(tài)機(jī)),更適合更復(fù)雜的任務(wù)。

模式匹配原語(yǔ)

元字符
匹配說(shuō)明
.
任意字符( 除了換行)

換行
*
0次或者多次重復(fù)前面的表達(dá)式
+
1次或者多次重復(fù)前面的表達(dá)式
?
0次或者1次重復(fù)前面的表達(dá)式
^
行的開(kāi)始
$
行的結(jié)尾
a|b
a or b
(ab)+

1次或者多次重復(fù)組ab

[...]
任意一個(gè)出現(xiàn)的字符

一些匹配的例子

表達(dá)式
匹配說(shuō)明
abc
abc
abc*
ab, abc, abcc, abccc,.....
abc+
abc, abcc, baccc,......
a(bc)+
abc, abcbc, abcbcbc,......
a(bc)?
a, abc
[abc]
a, b, c
[a-z]
a到z的任意字符
[a\-z]
a, -, z
[-az]
-, a, z
[a-zA-Z0-9]+
一個(gè)或者多個(gè)任何數(shù)字字母
[ \t\n]
witespace
[^ab]
除了a,b的任何字符
[a^b]
a, ^, b
[a|b]
a, |, b
a|b
a or b

匹配規(guī)則:

    1. 貪心: 兩個(gè)模式去匹同一個(gè)字符串,匹配上最長(zhǎng)的模式

    2. 順序優(yōu)先: 兩個(gè)相同長(zhǎng)度的模式, 匹配上先定義的模式

.l文件內(nèi)容的格式被%%分成了三部分,如下:

     ....definitions.....

%%

  .....rules....

%%

 ...subroutines...

    其中rules是必須的,其他部分可選

    一些內(nèi)置函數(shù)以及變量

int yylex(void)
調(diào)用分析器,返回 token
char *yytext
指定匹配的字符串
yyleng
匹配上的字符串的長(zhǎng)度
int yywrap(void)
返回1 則結(jié)束了
FILE *yyout
輸出文件,默認(rèn) stdout
FILE *yyin
輸入文件, 默認(rèn)stdin
INITIAL
initial start condition
BEGIN condition
switch start condition
ECHO 
write mached string

#define ECHO fwrite(yytext, yyleng, 1, yyout)

二、開(kāi)始第一個(gè)例子

   環(huán)境說(shuō)明:

          VMware Workstation 12 Pro, ubuntu17.04 ,lex2.6.1

    輸出文件的內(nèi)容并且在前面增加行號(hào)

   lineno.l

%{ 
    int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s",  ++yylineno, yytext);
%%
int main(int argc, char *argv[])
{ 
    FILE *fp = NULL;
    if (argc == 2) {
      fp = fopen(argv[1], "r");
      if (NULL != fp) {
         yyin = fp;  
      } 
    }  
     
    yylex();
    
    if (NULL != fp) { 
       fclose(fp); 
    }
    
    return 0;
}

 使用lex將lineno.l文件轉(zhuǎn)換為.c文件

  $ lex lineno.l
  $ls
  lex.yy.c lineno.l

   使用gcc 將lex.yy.c編譯成可執(zhí)行文件

   $ gcc lex.yy.c -o lineno

    /tmp/ccNgesbZ.o:在函數(shù)‘yylex’中:
    lex.yy.c:(.text+0x55c):對(duì)‘yywrap’未定義的引用
    /tmp/ccNgesbZ.o:在函數(shù)‘input’中:
    lex.yy.c:(.text+0x116c):對(duì)‘yywrap’未定義的引用
    collect2: error: ld returned 1 exit status

    網(wǎng)上查詢說(shuō)是要在.l文件中實(shí)現(xiàn)yywrap函數(shù)

    修改后:

%{   
  int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s",  ++yylineno, yytext);
%%
int main(int argc, char *argv[])
{    
     FILE *fp = NULL;
     yylineno = 0; 
     
     if (argc == 2) {    
         fp = fopen(argv[1], "r");    
         if (NULL != fp) {   
            yyin = fp;   
          }   
      }   
        
      yylex();  
      
      if (NULL != fp) {    
          fclose(fp);  
      }   
      
     return 0;
}

int yywrap()
{ 
    return 1;
}

再次編譯成功

$gcc lex.yy.c -o lineno
$lineno lineno.l

  1    %{
   2            int yylineno;
   3    %}
   4
   5    %%
   6    ^(.*)\n printf("%4d\t%s",  ++yylineno, yytext);
   7    %%
   8
   9    int main(int argc, char *argv[])
  10    {
  11            FILE *fp = NULL;
  12            yylineno = 0;
  13
  14            if (argc == 2) {
  15                    fp = fopen(argv[1], "r");
  16                    if (NULL != fp) {
  17                            yyin = fp;
  18                    }
  19            }
  20
  21            yylex();
  22
  23            if (NULL != fp) {
  24                    fclose(fp);
  25            }
  26
  27            return 0;
  28    }
  29
  30    int yywrap()
  31    {
  32            return 1;

  33    }

以上就是如何理解lex和yacc,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:如何理解lex和yacc
文章源于:http://www.chinadenli.net/article32/pisjpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)網(wǎng)站策劃靜態(tài)網(wǎng)站Google網(wǎng)頁(yè)設(shè)計(jì)公司商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)