我有一个使用Flex / Bison生成的解析器 - 它解析文件的每一行并返回该行的一些输出。我的输入数据有点腐败,我想要做的是在我想要bison忽略的行的开头添加一个特殊字符(比如#),并且仅将该行回显到输出。
所以,如果我的输入看起来像
apples 3 ate
oranges 4 consumed
# rhino ten
解析后的输出可能是
I ate three apples
I consumed four oranges
# rhino ten
有一些简单的方法可以做到这一点吗?
答案 0 :(得分:3)
您可以在弹性扫描仪中以词汇方式执行此操作。
类似的东西:
^#.*\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); }
;
不确定是否包含该换行符;我不知道你是如何处理这些的。所以它可能不合适。