将多个正则表达式分组以便在 lex 中重用

Group multiple regular expressions for reuse in lex

我想使用多个正则表达式如下(伪代码):

[0-9]+|[0-9]+.[0-9]+ - number
+|-|*|/ - sign

[number][sign][number]=[number] - math expression

我找到的最接近的东西是 this,但代码在 JavaScript 中,而我想为它使用 lex / flex。

是否可以使用正常的 RegEx 语法?

(F)lex 提供了定义什么是宏的可能性。定义在 definitions 部分(在第一个 %% 之前),简单语法在 flex manual 中描述,带有示例。

所以你可以写

number [0-9]+|[0-9]+.[0-9]+
sign [+*/-]
%%
{number}{sign}{number}={number}     { /* do something */ }

但这很少是个好主意,而且肯定不是 (f)lex 的预期用途。通常,您会使用 flex 将输入分解为五个标记的序列:一个数字、一个运算符、另一个数字、一个 = 和一个最终数字。您将使用重复调用 flex 生成的扫描器的解析器来构建表示方程式的对象(或者验证方程式,如果这是意图的话。)

如果您使用问题中提出的正则表达式,您肯定会最终 重新扫描 匹配的方程以提取其组成部分;避免重新扫描几乎总是更好。