【发布时间】:2014-12-11 05:45:56
【问题描述】:
我正在尝试将词法分析器编程为标准 C 翻译单元,因此我将可能的标记分为 6 组;每个组都有一个正则表达式,它将被转换为 DFA:
关键字 - (将有一个包含“goto”、“int”的符号表....)
标识符 - [a-zA-z][a-zA-Z0-9]*
数字常量 - [0-9]+/.?[0-9]*
字符串常量 - ""[EVERY_ASCII_CHARACTER]*""
特殊符号 - (将有一个包含“;”、“(”、“{”....)的符号表
运算符 - (将有一个包含“+”、“-”...的符号表)
My Analyzer 的输入是字节/ASCII 字符流。我的算法如下:
assuming there's a stream of characters, x1...xN
foreach i=1, i<=n, i++
if x1...xI accepts one or more of the 6 group's DFA
{
take the longest-token
add x1...xI to token-linked-list
delete x1...xI from input
}
但是,该算法将假定给定的每个字节(一个字母)都是一个标识符,因为在输入 1 个字符后,它接受标识符令牌的 DFA([a-zA-Z][ a-zA-Z0-9]*)。
另一个可能的问题是输入“intx;”,我的算法会将这个流标记为“int”、“x”、“;”这当然是一个错误。
我正在尝试考虑一种新算法,但一直失败。有什么建议吗?
【问题讨论】:
-
为什么?
gnu-flex已经存在。 -
我正在编写一个编译器。
-
“我正在编写一个编译器。” ——嗯,是吗?这与使用 flex 并不矛盾。但是如果你必须自己动手......关于如何编写词法分析器已经写了很多,我建议你阅读其中的一些,因为你的方法很糟糕,速度非常慢,并且会产生错误的结果。
-
@RonPinkas Gee,Ron,我当然想知道我的方法很糟糕,而且我无法理解为什么不理解。
-
@RonPinkas 也许您没有阅读我的评论,与您的这些 cmets 相比,我的评论更有用。
标签: c regex compiler-construction lexical-analysis