忘了愛

导航

flex 介紹

把分析工作分成兩個部分 詞法分析與與法分析

詞法分析:(lexical analysis 或 scanning)
語法分析:(syntax analysis 或 parsing)
詞法分析:把一行字轉化成有意義的詞塊,稱為記號(token)
語法分析:確定記號根記號之間如何關聯

詞法分析通常所做的事 就是在輸入的文字間尋找字符的模式(pattern)
正則表達式:(regular expression 或 regex或 regexp)

%{
    // 第一部分 %{ %}
    // 將原封不動移動到flex產生文件的頭部分
    // 聲明和選項設置
    int words = 0;
    int lines = 0; 
    int chars = 0;

    // 第二部分一系列模式和動作
    // 模式 動作
    // 當模式匹配時 就會執行{}裡的程序
    // 正則表達式 {c語言程序}
%}

%%
[A-Za-z]+   {
    words++; 
    chars += strlen(yytext);
    }
\n          {lines++; chars++;}
.           {chars++;}


%%
int yywrap(){
    return 1;
}
int main(int argv, char **argc){
    yylex();
    printf("words:%04d \nlines:%04d \nchars:%04d\n\n\n", words, lines, chars);
}

flex程式分成使用%%分為三個部分

%{
#include<stdio.h>
//第一部分 聲明
%}

%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%
calclist:
    | calclist exp EOL {printf("= %d\n", $2);}
    ;
exp: factor
    | exp ADD factor {$$ = $1 + $3;}
    | exp SUB factor {$$ = $1 - $3;}
    ;
factor: term 
    | factor MUL term {$$ = $1 * $3;}
    | factor DIV term {$$ = $1 / $3;}
    ;

term: NUMBER 
    | ABS term {$$ = $2 >= 0? $2: - $2;}
    ;
%%

int main(int argv, char **atgc) {
    yyparse();
}
yyerror(char *s) {
    fprintf(stderr, "error: %s\n", s);
}
```txt

posted on 2021-01-11 04:54  忘了愛  阅读(59)  评论(0编辑  收藏  举报