我有一个使用Flex / Bison生成的解析器-它解析文件的每一行,并为该行返回一些输出。我的输入数据有点损坏,我想做的是在我希望野牛忽略的行的开头添加一个特殊字符(如#),而只是将行回显到输出。

所以如果我的输入看起来像

apples 3 ate
oranges 4 consumed
# rhino ten

解析这些行后,我的输出可能是
I ate three apples
I consumed four oranges
# rhino ten

有一些简单的方法可以做到这一点吗?

最佳答案

您可以在flex扫描仪中按词法进行此操作。

就像是:

^#.*\n   { fputs(yytext, stdout); /* increment line number */ }

或在解析器中:
^#.*\n   { yystype.lexeme = strdup(yytext);
           return HASH_ECHO; /* token type defined in parser */ }

在解析器中,仅从顶级语法生成以下内容:
/* in top section */
%union {
   /* ... */
   char *lexeme;
   /* ... */
}

%token<lexeme> HASH_ECHO
/*...*/

/* make sure this rule is hooked into your grammar, of course */
hash_echo : HASH_ECHO { fputs($1, stdout); free($1); }
          ;

不确定是否包含该换行符;我不知道你如何处理这些。因此,这可能不合适。

09-06 19:58