注:
课程:《编译技术》上机
实验一:词法语法分析器的设计与实现,生成抽象语法树。
建议使用词法语法分析程序生成工具如:LEX/FLEX , YACC/BISON等专业工具完成。
此处完成补充 for循环 的操作
さらに:Da Karmaが私の個人的なブログWebサイトをサポートすることを願っています:www.xyzsh.cn
記事が更新された場合、個人的なWebサイトが最初に発行されます(CSDNにレビューがあります)
私はそれを踏むことができると思います〜!
準備
- 前の記事の補足char操作が完了しました
- 魔法の変更後、フォルダ全体が振り返る準備ができています
実験を開始する
最初の一歩
lex.lファイルを変更します(lex記述ファイルは各タイプの字句単位のルールを提供します)
- 37行目にの文字列の認識を挿入します
- 38行目に文字列の切れ目の認識を挿入します
- 39行目は文字列continueの認識を挿入します
第二段階
parser.yファイルを変更します(parser.yはC言語の文法です)
- 36行目はFameFOR BREAKCONTINUEという単語を挿入しています
- 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(几个非终结符)
- 125〜126行目にbreak andcontinue文法を挿入します。
ターミネータは子ノードを作成する必要がないため、mknodeの最初のパラメータは0です。
3番目のステップ
ast.cファイルを変更します(ast.cはツリーの生成と出力を定義します)
- 83行目に挿入するforの出力を
説明する必要はありません。各文はフローに沿ったものです。
最初に親ノードであるForループ名を出力し、次に4つの子ノードがあります。各ノードはindent +3
とindent + 6です。子ノードの内部定義であり、子ノードの子ノードです
- 行93にbreakandcontiueの出力を挿入します
補足:printf( "%* cCHAR:%c \ n"、indent、 ''、T-> type_char);の意味を説明してください:最初にインデントスペースを印刷し、次にCHARを印刷します:%cは
デフォルトで下位レベルになります。 3スペース戻る
4番目のステップ
test.cファイル(テストコード)を変更します
- 16〜19行目はforループをテストしています
- 18行目はテストブレークです
- 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エンコーディングインターフェイスに切り替えてください。
ブレーク出力が完了しました!
継続出力が完了しました!
 for循环补充完成啦!有没有感觉自己又会了hhhhhh
最後に書かれました
上記がお役に立てば幸いです。
間違いや違うアイデアがあったら、指摘して、お互いに学び、一緒に進んでください!