【发布时间】:2019-08-12 17:49:27
【问题描述】:
我有一个程序应该根据命令行参数来调整其输入。所以,要求1/2 的词法为:
NUMBER
SLASH
NUMBER
...当给定一个命令行参数时,词法为:
FREEFORM_TOKEN
...当给定另一个命令行参数时。我使用的工具是flex。
我想知道 flex 是否可以支持这个用例。我的规则是:
[0-9]+(.[0-9]+)?([eE][-+]?[0-9]+)? {
yylval->d = atof(yytext);
return NUMBER;
}
[A-Za-z0-9_.]([A-Za-z0-9_./]*[A-Za-z0-9_.])? {
yylval->s = strdup(yytext);
return FREEFORM_TOKEN;
}
我可以通过 if 语句简单地动态打开/关闭然后标记,如下所示:
[0-9]+(.[0-9]+)?([eE][-+]?[0-9]+)? {
yylval->d = atof(yytext);
return NUMBER;
}
[A-Za-z0-9_.]([A-Za-z0-9_./]*[A-Za-z0-9_.])? {
if (cmd_line_argument_given)
{
yylval->s = strdup(yytext);
return FREEFORM_TOKEN;
}
}
...或者 .l 文件中的长正则表达式是否存在一些问题,这会导致 1/2 匹配但不返回任何内容?
在实践中我应该如何实现这个要求?
我应该这样做吗:
<INITIAL,CMDOPT>[0-9]+(.[0-9]+)?([eE][-+]?[0-9]+)? {
yylval->d = atof(yytext);
return NUMBER;
}
<CMDOPT>[A-Za-z0-9_.]([A-Za-z0-9_./]*[A-Za-z0-9_.])? {
yylval->s = strdup(yytext);
return FREEFORM_TOKEN;
}
...如果我想打开FREEFORM_TOKEN,然后执行BEGIN(CMDOPT),如果我想关闭FREEFORM_TOKEN,就让它保持INITIAL 状态?那么所有规则都将具有INITIAL 和CMDOPT 状态,但FREEFORM_TOKEN 除外,它只有CMDOPT 状态。
【问题讨论】:
标签: c flex-lexer lex