如何在Regex

时间:2016-06-09 07:40:32

标签: regex bison flex-lexer

我正在修改flex和bison以创建一个小型计算器程序。令牌将是这样的:

read A
read B

sum := A + B
write sum

读,写将是关键字,指示读取值或向输出写入值。 ":="是赋值运算符。 A,B是标识符,可以是字符串。还会发表评论//comment并阻止评论/* asdfsd */

这些正则表达式是否正确指定我指定的小语法?

[:][=]    //assignment operator
[ \t]     //skipping whitespace
[a-zA-Z0-9]+      //identifiers
[Rr][Ee][Aa][Dd]   //read symbols, not case-sensitive
[/][/]         `//comment`

对于赋值运算符和注释正则表达式,我可以这样做吗?会弯曲和野牛接受吗?

":="      //assignment operator
"//"      //comment

2 个答案:

答案 0 :(得分:2)

是的,":="和" //"虽然评论规则应该是"//".*,但是你想要在//之后跳过所有内容(直到行尾)。如果您只是匹配" //",flex将尝试对其后面的内容进行标记,这是您不想要的,因为评论不必包含有效令牌(甚至如果确实如此,解析器应该看到这些令牌。

进一步[Rr][Ee][Aa][Dd]应放在标识符规则之前。否则它将永远不会匹配(因为如果两个规则可以匹配相同的lexeme,flex将选择文件中首先出现的那个)。它也可以更简洁地编写为(?i:read),或者您可以使用%option caseless全局启用不区分大小写,只需编写read

答案 1 :(得分:0)

您可以从(使用忽略大小写选项)开始:

  • (read|write)\s+[a-z]+将匹配读/写表达式;
  • [a-z]+\s:=[a-z+\/* -]*会将分配与简单的微积分匹配;
  • \/\/.*将匹配内联评论;
  • \/\*[\s\S]*\*\/将匹配多行注释。

请记住,这些是基本的正则表达式,可能不适合过于复杂的语法。

您可以使用Regex101.com来尝试