sql解析中的語法分析工具,和flex配合使用。
1、不能處理歧義語法,在歧義語法中,同樣的輸入符合多個分析樹
2、不能處理需要向前看多於乙個標記才能確定它是否已經匹配一條規則的語法。
詞法分析程式將標記返回給語法分析程式時,如果標記有相關的值,詞法分析程式在返回之前都必須在yylval中儲存值。
yylval預設為int型,在更複雜的語法分析程式中,yacc將yylval定義為乙個union型別,放置在y.tab.h中。
定義段:處理yacc生成的語法分析程式的控制資訊,建立語法分析程式的執行環境
規則段:包含語法分析程式的規則;
**段:被逐字拷貝到生成的c程式中的c**
定義段常見內容:
1、標記的描述
例:/* ordinary key words in alphabetical order */
%token abort_p absolute_p access action add_p admin after
注意:可以將單個被引起來的字元作為標記而不用宣告它們,所以不需要宣告「=」、「+」或「-」
2、%type宣告
用%type 宣告非終結符的型別,每個宣告都有如下格式:
%type name,name…
"type"名字必須由「%union"定義,每個name都是乙個非終結符的名字
3、%union宣告
%union宣告識別符號號值的所有可能c型別,宣告採用這種格式:
%union
域宣告被逐字拷貝到輸出檔案中yystype型別的c聯合型別宣告中
在沒有%union宣告時,yacc將yystype定義為int,所以所有的符號值都是整數
例:
%union
4、結合規則(associativity)宣告:%left 左結合性宣告,%right 右結合性宣告,%nonassoc 宣告沒有結合規則
例:%left 『+』 『-』
%left 『*』 『/』
yacc與lex程式結構都包括定義段、規則段、**段三段,但規則段語法有以下不同:起始符號:第一條規則左側的符號通常是起始符號,但可以在定義部分使用%start宣告覆蓋它
%prec: 宣告所用標記的優先順序,常與宣告段的%nonassoc配合使用,例:
%left '-' '+'
%left '*' '/'
%nonassoc uminus
%%expression
: expression '+' expression
| expression '-' expression
| expression '*' expression
| expression '/' expression
| '-' expression %prec uminus //%prec告訴yacc為這條規則使用uminus的優先順序
%%
lex+yacc實現簡單計算器程式:
詞法分析程式ch1-1.l:
%
%%[0-
9]+
[ \t] ;
\n return 0;
. return yytext[0];
%%int yywrap()
語法分析程式ch1-1.y
%
%token name number
%%statement
: name '=' expression
| expression
;expression
: expression '+' number
| expression '-' number
| number
;%%extern file *yyin;
int main()while(!feof(yyin));
}void yyerror(char *s)
~
編譯及執行:
lex ch1-1.l //生成lex.yy.c
yacc -d ch1-1.y //生成y.tab.c和y.tab.h
cc -o test y.tab.c lex.yy.c //生成可執行檔案
./test //測試
Lex與Yacc學習(九)之Yacc語法
本文討論yacc語法的格式並描述可用的各種特徵和選項 yacc語法包括三部分 定義段 規則段和使用者子例程段 定義段.規則段.使用者子例程段.各部分由以兩個百分號開頭的行分開,儘管某乙個部分可以為空,但是前兩部分是必須的,第三部分和前面的百分號可以省略。yacc 語法由符號組成,即語法的 詞 符號是...
Kt學習筆記(一) 語法基礎
二 基本資料型別 1 1 定義變數 var n int 30 定義變數 var ok int 定義乙個變數,沒有進行初始化 val m int 20 定義乙個常量 不需要設定m ok 40 對變數賦值 m 40 編譯出錯 var cannot be reassigned var k 100 自動推導...
Python學習筆記一之基礎語法
python是一種解釋性 意味著開發過程沒有編譯環節,相對於編譯性語言而言 物件導向 動態資料型別的高階程式語言。識別符號 第乙個字元必須是字母表中的字母或下劃線 識別符號的其它部分由字母 數字和下劃線組成。識別符號區分大小寫。python3允許使用中文作為變數名,非ascii碼識別符號也是允許的。...