Lex:收集规则中未定义的所有文本

时间:2016-01-17 22:57:36

标签: formatting state flex-lexer lex

我试图将之前规则未定义的所有文本收集到字符串中,并使用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;}

这样做的好方法是什么?只要不符合另一条规则,是否有某种程度可以继续?

1 个答案:

答案 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); }

(我滑过处理空白和换行符,但它只是概念性的。)