我正在修改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
答案 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来尝试