我试图将之前规则未定义的所有文本收集到字符串中,并使用lex将其作为格式化字符串的前缀。我想知道是否有标准方法可以做到这一点。
例如,说我有规则:
word1|word2|word3|word4 {printf("%s%s", "<>", yytext);}
[0-9]+ {printf("%s%s", "{}", yytext);}
everything else {printf("%s%s", "[]", yytext);}
我试图勒索字符串:
word1 this is some other text ; word2 98 foo bar .
我希望在通过词法分析器时产生以下内容:
<>word1[] this is some other text ; <>word2[] {}98[] foo bar .
我尝试使用状态执行此操作,但意识到我无法确定何时停止检查,例如:
%x OTHER
%%
. {yymore(); BEGIN OTHER;}
<OTHER>.|\n yymore();
<OTHER>how to determine when to end? {printf("%s%s", "[]", yytex); BEGIN INITIAL;}
这样做的好方法是什么?只要不符合另一条规则,是否有某种程度可以继续?
答案 0 :(得分:1)
AFAIK,没有&#34;标准&#34;解决方案,但一个简单的方法是保留一些上下文(最后打印的前缀)并使用它来决定是否打印新的前缀。例如,您可以使用这样的自定义打印机:
enum OutputType { NO_TOKEN = 0, WORD, NUMBER, OTHER };
void print_with_prefix(enum OutputType type, const char* token) {
static enum OutputType prev = NO_TOKEN;
const char* prefix = "";
switch (type) {
case WORD: prefix = "<>"; break;
case NUMBER: prefix = "{}"; break;
case OTHER: if (prev != OTHER) prefix = "[]"; break;
default: assert(false);
}
prev = type;
printf("%s%s", prefix, token);
}
然后你只需要改变对printf
的调用来调用print_with_prefix
(并且,如所写,提供枚举值而不是字符串)。
对于OTHER
案例,您不需要做任何特殊的事情来累积令牌。刚
. { print_with_prefix(OTHER, yytext); }
(我滑过处理空白和换行符,但它只是概念性的。)