在野牛中建立一个直通规则

时间:2012-03-06 06:32:50

标签: c++ c bison flex-lexer

我有一个使用Flex / Bison生成的解析器 - 它解析文件的每一行并返回该行的一些输出。我的输入数据有点腐败,我想要做的是在我想要bison忽略的行的开头添加一个特殊字符(比如#),并且仅将该行回显到输出。

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

apples 3 ate
oranges 4 consumed
# rhino ten

解析后的输出可能是

I ate three apples
I consumed four oranges
# rhino ten

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

1 个答案:

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

不确定是否包含该换行符;我不知道你是如何处理这些的。所以它可能不合适。