假设我有一个法正则表达式等

[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字符串,这样我可以具有有意义的错误条件

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

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

有帮助吗?

解决方案

哇!有趣的方案。

如果你要检测的词法分析器,你就必须有一个以“任何其他方式无法识别字符串”优惠和产生错误消息一个包罗万象的规则。

确定它是造成的麻烦将是地狱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; }

请注意插入记号的放置,以及不存在问号! 与非数字或数字太多,或太少的数字处理 - !urgh

一般情况下,你会认识到所有的“标识符”,然后确认哪些是OK的更好:

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

选择你的毒药你允许进入的验证例程;它决定什么被输入是否OK与否,它的返回值控制什么莱克斯规则返回语法。这是从标识符区分关键字太的一种方式。

概括和简化正则表达式,以满足真正的推移。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top