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

标签 regex bison flex-lexer

我正在修改 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/

相关文章:

regex - 在大文本中找到某种模式的有效方法是什么?

macros - 在 yacc/bison lex 中处理#define 宏

c - 简单的弹性程序

regex - 在JSF 2/PrimeFaces中使用正则表达式进行电子邮件验证

regex - 在python文件中找到一个单词时提取值

javascript - 如何使用 javascript 替换从字符串中删除所有数字和所有文本?

c - 弹性给予 "fatal scanner internal error--end of buffer missed"

parsing - 在同一个应用程序中是否可以有两个或多个 Lex/Yacc 解析器

C 仅导出所需符号(不编辑原始文件)

c++ - 在 yacc 文件中使用 C++ 代码