如何在正则表达式中指定特定的字符串

How to specify a specific string in Regex

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

read A
read B

sum := A + B
write sum

Read、write 将是关键字,指示在输出中读取值或将值写入输出。 “:=”是赋值运算符。 A,B 是标识符,可以是字符串。还会有评论//comment和块评论/* asdfsd */

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

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

对于赋值运算符和注释正则表达式,我可以只这样做吗? flex 和 bison 会接受吗?

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

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

  • (read|write)\s+[a-z]+ 将匹配 read/write 表达式;
  • [a-z]+\s:=[a-z+\/* -]* 将用简单的微积分匹配赋值;
  • \/\/.* 将匹配行内注释;
  • \/\*[\s\S]*\*\/ 将匹配多行注释。

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

你可以用Regex101.com试试

是的,“:=”和“//”会起作用,但注释规则实际上应该是 "//".*,因为您想跳过 // 之后的所有内容(直到行尾)。如果你只匹配“//”,flex 将尝试标记它后面的内容,这是你不希望的,因为评论不一定包含有效标记(即使它包含,这些标记应该被看到解析器)。

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