处理Lex而不是Yacc的错误情况?

时间:2009-08-14 23:06:59

标签: parsing lex flex-lexer lexical-analysis

假设我有一个像

这样的lex正则表达式
[aA][0-9]{2,2}[pP][sS][nN]? { return TOKEN; }

如果用户输入

A75PsN
A75PS

匹配

但如果用户说出类似

的内容
A75PKN

我希望它出错并说“字符K无法识别,期待S”

我现在正在做的就是把它写成

let [a-zA-Z]
num [0-9]

{let}{num}{2,2}{let}{2,3}

然后基本上重新使用Yacc中的字符串,以便我可以有有意义的错误条件

我怎样才能解决这个问题?

我唯一能想到的就是使用命名组?

1 个答案:

答案 0 :(得分:2)

哇!有趣的计划。

如果您要在词法分析器中检测到这种情况,则必须使用一个包含“任何其他无法识别的字符串”的全能规则并生成错误消息。

确定导致麻烦的是K将会是地狱。

[^aA][0-9]{2,2}[pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[^pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][^sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][sS][^nN]  { report_error(); return ERROR; }

注意放置插入符号,并且没有问号! 处理非数字,或数字太多或数字太少 - 呃!

通常,您最好识别所有“标识符”,然后验证哪些标识符正常:

[a-zA-Z][0-9]{2,2}[a-zA-Z]{2,5} { return validate_id_string(); }

在验证程序中选择您允许的毒药;它决定输入的内容是否正常,其返回值控制Lex规则返回语法的内容。这是区分关键字和标识符的一种方法。

概括并简化正则表达式以适应真实情况。