将多个正则表达式分组以便在 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 生成的扫描器的解析器来构建表示方程式的对象(或者验证方程式,如果这是意图的话。)
如果您使用问题中提出的正则表达式,您肯定会最终 重新扫描 匹配的方程以提取其组成部分;避免重新扫描几乎总是更好。
我想使用多个正则表达式如下(伪代码):
[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 生成的扫描器的解析器来构建表示方程式的对象(或者验证方程式,如果这是意图的话。)
如果您使用问题中提出的正则表达式,您肯定会最终 重新扫描 匹配的方程以提取其组成部分;避免重新扫描几乎总是更好。