注:
课程:《编译技术》上机
实验一:词法语法分析器的设计与实现,生成抽象语法树。
建议使用词法语法分析程序生成工具如: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
- La operación de caracteres suplementarios del artículo anterior se ha completado.
- La carpeta completa ha sido preparada para la retrospectiva después del cambio mágico.
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)
- Insertar reconocimiento de la cadena para en la línea 37
- Insertar reconocimiento de la ruptura de cadena en la línea 38
- La línea 39 inserta el reconocimiento de la cadena continuar
Segundo paso
Modificar el archivo parser.y (parser.y es la gramática del lenguaje C)
- Inserte la palabra Fama en la línea 36 PARA DESCANSAR CONTINUAR
- 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是函数体,有大括号包起来的变量定义列表+语句列表
{
$$=mknode(4,FOR,yylineno,$3,$4,$6,$8);}的含义
mknode是创建子节点的函数,
4表示创建4个节点
FOR是该文法的标识(type)
yylineno是当前行数
$3,$4,$6,$8分别对应Def Exp Exp Stmt(几个非终结符)
- 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
tercer paso
Modificar el archivo ast.c (ast.c define la generación y salida del árbol)
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 salida de break y continúe en la línea 93
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)
- Las líneas 16-19 están probando el bucle for
- La línea 18 es el salto de prueba
- El 25 es la prueba continua
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
Encontré caracteres confusos , use chcp 65001 para cambiar a la interfaz de codificación UTF-8
para que la salida del bucle esté completa.
¡
Salida de interrupción completa! ¡ Salida continua completa!
 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.