在处理莱克斯而不是Yacc的错误条件?
-
16-09-2019 - |
题
假设我有一个法正则表达式等
[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与否,它的返回值控制什么莱克斯规则返回语法。这是从标识符区分关键字太的一种方式。
概括和简化正则表达式,以满足真正的推移。
不隶属于 StackOverflow