我有一个使用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); }
;
不确定是否包含该换行符;我不知道你如何处理这些。因此,这可能不合适。