如何在正则表达式中指定特定的字符串
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
.
我正在修改 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
.