用lex实现一个tiger语言的词法分析器.
tiger语言词法规范:
- 标识符
以字母开头,由字母、数字和下划线组成的序列。区分大小写字母。 - 注释
可以出现在任意两个单词之间。以/*开始,以*/结束,并且可以嵌套。 - 整型常量
由十进制数字组成的一个序列。没有负整型,对于带负号的整型需返回两个单词 字符串常量
由括在双引号之间的零至多个可打印字符、空白符或转义序列组成的序列。
tiger允许的转义序列- \n 换行符 - \t 制表符 - \^c 控制字符c - \ddd ASCII码为ddd(三位十进制)的单个字符 - \* 双引号(") - \\ 反斜线(\) - \f___f\ 此序列将被忽略
保留字
while、for、to、break、let、in、end、function、var、type、array、if、then、else、do、of、nil。- 标点符号
, : ; ( ) [ ] { } . + - * / = <> < <= > >= & | :=
实现:
- 注释
设置COMMENT状态。变量count保存注释嵌套层数,实现注释的进入和跳出。 字符串
设置STR和VSTR状态。用一动态内存缓存字符串,读入时特殊字符特殊处理,否则加入缓存。字符串结束时如果没出错返回其值。错误处理
errormsg.[ch]文件中实现,用一链表保存每行开始字符序号,跟据给的字符序号输出出错token的行号,列号。文件结束
文件结束即返回,注意EOF在COMMENT、STR和VSTR的出错情况。tiger.lex实现:
%{
#include <string.h>
#include "util.h"
#include "tokens.h"
#include "errormsg.h"
int charPos=1;
int yywrap(void)
{
charPos=