注:
課程:《編譯技術》上機
實驗一:詞法語法分析器的設計與實現,生成抽象語法樹。
建議使用詞法語法分析程式生成工具如: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...