假设我有一个像
这样的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中的字符串,以便我可以有有意义的错误条件
我怎样才能解决这个问题?
我唯一能想到的就是使用命名组?
答案 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规则返回语法的内容。这是区分关键字和标识符的一种方法。
概括并简化正则表达式以适应真实情况。