編譯原理(8) 二元式展示

2021-10-10 16:06:39 字數 2432 閱讀 6125

注:

課程:《編譯技術》上機

實驗一:詞法語法分析器的設計與實現,生成抽象語法樹。

建議使用詞法語法分析程式生成工具如:lex/flex , yacc/bison等專業工具完成。

此處完成補充 二元式展示+新增程式根 的操作

前期準備

已經將整個資料夾都備好份,以供魔改後的回溯

開始實驗

第一步修改lex.l檔案(lex描述檔案給出了每一類詞法單元的規則)

大改!!!每個匹配後的執行語句都加上printf

%

yylval;

#define yystype yylval%}

%option yylineno

id [a-za-z]

[a-za-z0-9]

*int[0

-9]+

float([

0-9]

*\.[0-

9]+)

|([0

-9]+\.

)char

(\'[

^\n]\')

|(\"[

^\n]\")%%

"int"

"float"

"char"

"return"

"if"

"else"

"while"

"for"

"break"

"continue"

";"","

">"

|"|">="

|"<="

|"=="

|"!="

"=""+"

"-""++"

"--"

"*""/"

"&&"

"||"

"!""("

")""

"}""["

"]"[\n]

[ \r\t].%

%int

yywrap()

第二步

修改parser.y檔案(parser.y是c語言文法)

第60行修改exp語法

老師想要程式有根,那麼根從**來,就在這裡新增語句

其實一開始我是想要搞乙個將源**的檔名輸出出來的操作得(test.c程式體:),但是引數是從main(int argc, char * ar**)的ar**[1]獲取的,但是很遺憾咱們的輸出語句是在main執行前完成的,不能夠獲取到那個引數,so…木得了

第三步修改ast.c檔案(ast.c定義了樹的生成與輸出)

第26行修改ext_def_list的輸出,indent+3

為的是所有的**輸出都後移3個單位,從而體現出「程式體」文字的統領全篇

補:解釋一下 printf("% * cchar:%c\n",indent,』 ',t->type_char);的含義:先列印indent個空格,再列印char:%c

預設低一級的話,往後移3個空格

結果檢驗

依次執行

發現有亂碼,使用chcp 65001切換到utf-8編碼介面

二元式輸出完成!

程式有根了hhhh!

實驗一暫時就搞到這裡吧,還有很多功能沒有新增上,也還有很多bug其實我知道在**,但是並沒有精力去乙個個改好了,雖有一點點缺憾,但我已經足夠滿意了。加油呀,打工人!

寫在結尾

希望以上可以幫到你!

如有錯誤,或不同想法,歡迎指出,互相學習共同進步!

另:別催更了別催更了…,弟弟哭liao~

實驗二還沒有怎麼搞,之後如果感覺搞得還行的話肯定是會發的,emmmm如果自己弄的亂七八糟也肯定不會發的,哥哥姐姐們先自己加油好呱!

追更:更新了一點點,可以去看一哈~

二元多項式

time limit 1000ms memory limit 65536k 有疑問?點這裡 給你多個二元多項式和乙個操作符,讓你輸出操作符操作這些二元多項式之後的結果。首先輸入二元多項式的個數n和操作符號 後面n行輸入每乙個多項式。多組輸入,當n 0的時候結束輸入。n 5,二元多項式的長度小於100...

二元多項式

給你多個二元多項式和乙個操作符,讓你輸出操作符操作這些二元多項式之後的結果。首先輸入二元多項式的個數n和操作符號 後面n行輸入每乙個多項式。多組輸入,當n 0的時候結束輸入。n 5,二元多項式的長度小於1000,二元多項式都是由x,y,數字,組成的 輸出操作之後的結果。輸出的順序按照 x 2 x x...

二元多項式

time limit 1000ms memory limit 65536kb submit statistic discuss problem description 給你多個二元多項式和乙個操作符,讓你輸出操作符操作這些二元多項式之後的結果。input 首先輸入二元多項式的個數n和操作符號 後面n...