1

假设我有一个 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 中的字符串进行词法分析,以便我可以有有意义的错误条件

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

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

4

1 回答 1

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 规则返回给语法的内容。这也是区分关键字和标识符的一种方法。

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

于 2009-09-30T06:33:03.363 回答