コンパイルの原則(3)-ループ用

注:
课程:《编译技术》上机
实验一:词法语法分析器的设计与实现,生成抽象语法树。
建议使用词法语法分析程序生成工具如:LEX/FLEX , YACC/BISON等专业工具完成。

此处完成补充 for循环 的操作

さらに:Da Karmaが私の個人的なブログWebサイトをサポートすることを願っています:www.xyzsh.cn
記事が更新された場合、個人的なWebサイトが最初に発行されます(CSDNにレビューがあります)
私はそれを踏むことができると思います〜!

準備
  1. 前の記事の補足char操作が完了しました
  2. 魔法の変更後、フォルダ全体が振り返る準備ができています
    ここに写真の説明を挿入
実験を開始する
最初の一歩

lex.lファイルを変更します(lex記述ファイルは各タイプの字句単位のルールを提供します)

  1. 37行目にの文字列の認識を挿入します
  2. 38行目に文字列の切れ目の認識を挿入します
  3. 39行目は文字列continueの認識を挿入します
    ここに写真の説明を挿入
第二段階

parser.yファイルを変更します(parser.yはC言語の文法です)

  1. 36行目はFameFOR BREAKCONTINUEという単語を挿入しています
    ここに写真の説明を挿入
  2. stmt行92を変更し、forステートメントを挿入して、
     Stmtがステートメントを参照し、forループ全体がステートメントとしてカウントされることを説明します。ここでFOR LP Def Exp SEMI Exp RPStmtを定義します。
(对照着for(int a=0;a<10;a++){
    
    printf(" %d ",a);}来看)
LP是左括号,
Def是变量定义语句,因为Def包含分号;,所以下一个直接接上了Exp
Exp是复合表达式/语句(不带分号;)
SEMI是分号
又来一个EXP,a++可以看做是一个复合表达式的
Rp是右括号
Stmt,我想用的是Stmt:Compst这个文法,
Compst是函数体,有大括号包起来的变量定义列表+语句列表

ここに写真の説明を挿入

{
    
    $$=mknode(4,FOR,yylineno,$3,$4,$6,$8);}的含义
mknode是创建子节点的函数,
4表示创建4个节点
FOR是该文法的标识(type)
yylineno是当前行数
$3,$4,$6,$8分别对应Def Exp Exp Stmt(几个非终结符)
  1. 125〜126行目にbreak andcontinue文法を挿入します。
    ターミネータは子ノードを作成する必要がないため、mknodeの最初のパラメータは0です。
    ここに写真の説明を挿入
3番目のステップ

ast.cファイルを変更します(ast.cはツリーの生成と出力を定義します)

  1. 83行目に挿入するforの出力を
     説明する必要はありません。各文はフローに沿ったものです。
    最初に親ノードであるForループ名を出力し、次に4つの子ノードがあります。各ノードはindent +3
    とindent + 6です。子ノードの内部定義であり、子ノードの子ノードです
    ここに写真の説明を挿入
  2. 行93にbreakandcontiueの出力を挿入します
    ここに写真の説明を挿入

補足:printf( "%* cCHAR:%c \ n"、indent、 ''、T-> type_char);の意味を説明してください:最初にインデントスペースを印刷し、次にCHARを印刷します:%cは
デフォルトで下位レベルになります。 3スペース戻る

4番目のステップ

test.cファイル(テストコード)を変更します

  1. 16〜19行目はforループをテストしています
  2. 18行目はテストブレークです
  3. 25日はテスト継続です
    ここに写真の説明を挿入
結果チェック

 順次実行

flex lex.l
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c
parser test.c

ここに写真の説明を挿入
 文字化けした文字が見つかりました。chcp65001を使用して、
ここに写真の説明を挿入
 ループ出力用のUTF-8エンコーディングインターフェイス切り替えてください。
 ブレーク出力が完了しました!
ここに写真の説明を挿入
 継続出力が完了しました!

&emsp;for循环补充完成啦!有没有感觉自己又会了hhhhhh

最後に書かれました

上記がお役に立てば幸いです。
間違いや違うアイデアがあったら、指摘して、お互いに学び、一緒に進んでください!

おすすめ

転載: blog.csdn.net/zsh1184528359/article/details/109635198