yacc文法規則加入字元變數名

2021-06-25 07:38:57 字數 1592 閱讀 1050

因為這次加入了字元變數名,所以不能再用預設的yylval(int),這次使用的是乙個union,

%union

dval代表原來的number,不過這次支援了double,

vlbno代表的是字元變數名,在符號表裡面的位址

仍然在詞法分析的時候給yylval賦值,只不過遇到數字付給dval,如果是變數名字,那就設定vblno

完整的程式**

cal.y

%

%union

%token print

%token name

%token number

%type expression

%left '+' '-'

%left '*' '/'

%%paragraph:

paragraph statement '\n'

|statement '\n'

;statement:

print expression

|name '=' expression

;expression:

expression '*' expression

|expression '/' expression

|expression '+' expression

|expression '-' expression

|number

|name

;%%

cal.l

%

%%print

[0-9]+ |

[0-9]*\.[0-9]+

[ \t] ;

[a-z]

"$"

\n |

. %%

編譯**

nosourcesmatomacbook-pro:vtable nosources$ yacc -d cal.y && lex cal.l && cc -o calex.yy.c -ly -ll

nosourcesmatomacbook-pro:vtable nosources$ ./cal

a=1+2

test lex =

test lex number

test yacc number

test lex +

test lex number

test yacc number

test lex

test yacc expression + expression

test yacc = expression

print a

test lex print

test lex

test yacc print expression

result is 3.000000

全部的輸入語句,a=1+2,就在符號表裡面的a對應的位置賦值為1+2,然後print a,語句輸出符號表裡面a的位置的值

變數名命名規則

變數命名規則 識別符號 age 18 由字母 數字 命名 不能以資料開頭 嚴格區分大小寫 不能python的關鍵字 檢視python有哪些關鍵字?import keyword print keyword.kwlist false none true and as assert async await...

變數名的一些規則

變數的命名 變數名由作用域字首 型別字首 乙個或多個單詞組成。為便於界定,每個單詞的首字母要大寫。作用域字首 字首 說明無 區域性變數 m 類的成員變數 member sm 類的靜態成員變數 static member s 靜態變數 static g 外部全域性變數 global sg 靜態全域性變...

Python變數名命名一般規則

在python中定義的變數名,最好能夠一看就知道是什麼意思。變數名的組成 字母,數字和下劃線 組成,不能以數字開頭,嚴格區分大小寫,不能使用python關鍵字。使用下面 可以檢視python中的關鍵字 import keyword print keyword.kwlist 常用的命名方式有以下幾種 ...