我正在修改 flex 和 bison 来创建一个小型计算器程序。 token 将是这样的:
read A
read B
sum := A + B
write sum
Read、write 是关键字,指示在输出中读取值或向输出写入值。 “:=”是赋值运算符。 A,B 是标识符,可以是字符串。还有注释//comment
和 block 注释/* 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
最佳答案
是的,“:=”和“//”可以工作,尽管注释规则实际上应该是“//”。*
因为你想跳过//之后的所有内容(直到行结束)。如果您只匹配“//”,flex 将尝试标记其后面的内容,这是您不希望看到的,因为注释不必包含有效标记(即使包含有效标记,这些标记也应该由解析器)。
另外[Rr][Ee][Aa][Dd]
应放置在标识符规则之前。否则它永远不会匹配(因为如果两个规则可以匹配相同的词位,flex 将选择文件中第一个规则)。它也可以更简洁地编写为 (?i:read)
或者您可以使用 %option caseless
全局启用不区分大小写,只需编写 read
.
关于regex - 如何在正则表达式中指定特定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37719718/