使用GNU Flex实现C--语言的词法分析器

本文介绍如何使用词法分析工具 GNU Flex 编写一个 flex 规则文件,用于对使用 C-- 语言书写的源代码进行词法分析。

1. 实验要求

程序需要能够查出源代码中可能包含的词法错误:

  • 词法错误(错误类型 A): 出现 C-- 词法中未定义的字符以及任何不符合 C-- 词法单元定义的字符。

2. 输入格式

程序的输入是一个包含 C-- 源代码的文本文件,程序需要能够接收一个输入文件名作为参数。例如,假设你的程序名为 cc、输入文件名为 test1、程序和输入文件都位于当前目录下,那么在 Linux 命令行下运行 ./cc test1 即可获得以 test1 作为输入文件的输出结果。

3. 输出格式

3.1 包含词法错误

对于包含词法错误的输入文件,只需要输出相关的词法错误信息即可。

输出的信息包括错误类型、出错的行号以及说明文字,其格式为:

Error type [错误类型] at Line [行号]: [说明文字].

说明:

  • 说明文字的内容没有具体要求,但是错误类型和出错的行号一定要正确。- 输入文件中可能会包含一个或者多个词法错误(但输入文件的同一行中保证不出现多个错误),程序需要将这些错误全部报告出来,每一条错误提示信息在输出中单独占一行。

3.2 不包含词法错误

对于那些没有任何词法错误的输入文件,程序需要打印每一个词法单元的名称以及与其对应的词素,无需打印行号。词法单元名与相应词素之间以一个冒号和一个空格隔开,每一条词法单元的信息单独占一行。

词法单元例子:

| 词法单元 | 非正式描述 | 词素示例 ||---|---|---|| if | 字符 i, f | if || else | 字符 e, l, s, e | else || comparison | < 或 > 或 <= 或 >= 或 == 或 != | <=, != || id | 字母开头的字母/数字串 | Pi, score, D2 || number | 任何数字常量 | 3.14159, 0, 6.02e23 || literal | 在两个'之间,除'以外的任何字符 | 'core dumped' |

程序设计语言中常见的词法单元类别:

  1. 关键字2. 运算符3. 标识符4. 常量5. 界符

4. 示例程序

以下是一个使用 GNU Flex 进行 C-- 语言词法分析的示例程序:c%{#include <stdio.h>%}

%%[a-zA-Z][a-zA-Z0-9]* { printf('ID: %s ', yytext); }[0-9]+(.[0-9]+)?([eE][-+]?[0-9]+)? { printf('NUMBER: %s ', yytext); }'if' { printf('KEYWORD: if '); }'else' { printf('KEYWORD: else '); }'<=' { printf('COMPARISON: <= '); }'!=' { printf('COMPARISON: != '); }[(){};,] { printf('PUNCTUATION: %c ', yytext[0]); }'(.|[^'])*' { printf('STRING: %s ', yytext); }. { printf('Error type A at Line %d: Mysterious character '%s' ', yylineno, yytext); }%%

int main(int argc, char** argv) { if (argc < 2) { printf('Usage: %s <input_file> ', argv[0]); return 1; } FILE* file = fopen(argv[1], 'r'); if (!file) { printf('Error opening file: %s ', argv[1]); return 1; } yyin = file; yylex(); fclose(file); return 0

使用GNU Flex实现C--语言的词法分析器

原文地址: https://www.cveoy.top/t/topic/zMn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录