在c和正则表达式中使用flex
我正在尝试为编译器创建一个词法分析器.但是我在使用正则表达式查找关键字和实数等问题时遇到了问题.例如一些定义:
id [aA-zZ][aA-zZ-0-9_]* keyword if|else|when|while integer [0-9]+ real integer.integer ..但是有一些问题,分析师不能得到一个关键字,例如,如果我给“else”这个词,它将它视为一个id(我得到一个警告,像规则也不能匹配. 此外,如果我尝试给出一个实数,例如1.2 解决方法
Flex未检测到所需字符串的原因是读取输入时存在歧义.单词’else’对应正则表达式“else”和[a-zA-Z] [a-zA-Z0-9] *,但最后一个是首先写的,所以Flex决定输入必须适合这个正则表达式.
Flex是一个词法分析器,它读取输入文件并使用您希望它检查的任何正则表达式检查当前字符串.你必须始终记住驱动其字符串匹配系统的两个基本规则: >最长的最佳比赛; “最长的最佳匹配”告诉Flex,读取输入必须与最长的模式匹配; LBM规则优先工作得更好. 优先级规则告诉Flex,如果输入匹配多于一个正则表达式,则只需考虑第一个正则表达式. 在编写代码时,必须将关键字视为关键字而不是ID,然后您应该在其他任何事情之前编写关键字的正则表达式:如果某些内容与“关键字”正则表达式不匹配,则表示我们正在阅读其他内容,例如ID或函数的名称. 我会写这样的东西: keyword "if"|"else"|"when"|"while" id [a-zA-Z][a-zA-Z0-9_-]* nat [0-9]|([1-9][0-9]*) integer [+|-]*{nat} real {integer}[.]{integer} 关键字第一;如果我们不读取关键字,它可能是一个id;如果只有数字,让我们看看它是什么类型的数字.优先规则会让Flex读取’else’,’if’和其他关键字作为’关键字’标记,最长匹配将确保像1.2这样的数字被视为’真实’而不是两个’nat’被点分隔. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |