Principio de compilación (3) -for loop

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

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

Además: Espero que Da Karma apoye el sitio web de mi blog personal: www.xyzsh.cn Si el
artículo se actualiza, el sitio web personal se publicará primero (CSDN tiene una revisión)
¡Espero poder pisarlo ~!

Preparación preliminar
  1. La operación de caracteres suplementarios del artículo anterior se ha completado.
  2. La carpeta completa ha sido preparada para la retrospectiva después del cambio mágico.
    Inserte la descripción de la imagen aquí
Iniciar experimento
primer paso

Modificar el archivo lex.l (el archivo de descripción lex da las reglas para cada tipo de unidad léxica)

  1. Insertar reconocimiento de la cadena para en la línea 37
  2. Insertar reconocimiento de la ruptura de cadena en la línea 38
  3. La línea 39 inserta el reconocimiento de la cadena continuar
    Inserte la descripción de la imagen aquí
Segundo paso

Modificar el archivo parser.y (parser.y es la gramática del lenguaje C)

  1. Inserte la palabra Fama en la línea 36 PARA DESCANSAR CONTINUAR
    Inserte la descripción de la imagen aquí
  2. Modifique la línea stmt 92 e inserte la instrucción for para
     explicar que Stmt se refiere a una instrucción, y que el bucle for como un todo se cuenta como una instrucción. Defina FOR LP Def Exp SEMI Exp RP Stmt aquí
(对照着for(int a=0;a<10;a++){
    
    printf(" %d ",a);}来看)
LP是左括号,
Def是变量定义语句,因为Def包含分号;,所以下一个直接接上了Exp
Exp是复合表达式/语句(不带分号;)
SEMI是分号
又来一个EXP,a++可以看做是一个复合表达式的
Rp是右括号
Stmt,我想用的是Stmt:Compst这个文法,
Compst是函数体,有大括号包起来的变量定义列表+语句列表

Inserte la descripción de la imagen aquí

{
    
    $$=mknode(4,FOR,yylineno,$3,$4,$6,$8);}的含义
mknode是创建子节点的函数,
4表示创建4个节点
FOR是该文法的标识(type)
yylineno是当前行数
$3,$4,$6,$8分别对应Def Exp Exp Stmt(几个非终结符)
  1. Inserte el salto y continúe la gramática en las líneas
    125 a 126. El terminador no necesita crear nodos secundarios, por lo que el primer parámetro de mknode es 0
    Inserte la descripción de la imagen aquí
tercer paso

Modificar el archivo ast.c (ast.c define la generación y salida del árbol)


  1.  No es necesario explicar el resultado de insertar for en la línea 83. Cada oración debe seguir el flujo.
    Primero genere el nombre del bucle For, que es el nodo principal, y luego hay cuatro nodos secundarios, cada uno de los cuales es sangría + 3
    y sangría + 6 Es la definición interna del nodo hijo, es el nodo hijo del nodo hijo
    Inserte la descripción de la imagen aquí
  2. Inserte la salida de break y continúe en la línea 93
    Inserte la descripción de la imagen aquí

Suplemento: explique el significado de printf ("% * cCHAR:% c \ n", indent, '', T-> type_char) ;: primero imprima espacios de sangría y luego imprima CHAR:% c
predeterminado a un nivel inferior, luego Retroceder 3 espacios

el cuarto paso

Modificar el archivo test.c (código de prueba)

  1. Las líneas 16-19 están probando el bucle for
  2. La línea 18 es el salto de prueba
  3. El 25 es la prueba continua
    Inserte la descripción de la imagen aquí
Verificación de resultados

 Ejecutar secuencialmente

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

Inserte la descripción de la imagen aquí
 Encontré caracteres confusos , use chcp 65001 para cambiar a la interfaz de codificación UTF-8
Inserte la descripción de la imagen aquí
 para que la salida del bucle esté completa.
 ¡
Inserte la descripción de la imagen aquí
 Salida de interrupción completa! ¡ Salida continua completa!

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

Escrito al final

¡Espero que lo anterior pueda ayudarte!
Si hay errores o ideas diferentes, indíquelos, aprendan unos de otros y progresen juntos.

Supongo que te gusta

Origin blog.csdn.net/zsh1184528359/article/details/109635198
Recomendado
Clasificación