如何为每个规则野牛行动

时间:2017-04-15 19:19:50

标签: compiler-construction bison lalr bisonc++

我正在尝试使用flex和bison创建一个小编译器,但我没有得到如何为每个规则提供操作

我的语法就像:

     %union{
            std::string *s;
    };

%start program
%type <s> expr

%token <s> KEYWORD
%token <s> VARIABLE

%%

program : KEYWORD {std::cout << "A"; } 
| KEYWORD VARIABLE {std::cout << "B"; }

变量正则表达式是[a-zA-Z0-9]

&#34;帽&#34;是我的关键字

如果我输入&#34;大写锁定&#34; (caps = KEYWORD和lock = VARIABLE) 我输出的是&#34; B&#34;

如果我将输入作为大写,那么它会等到我输入下一个单词并且在输入任何下一个单词之后它会打印&#34; Asyntax错误&#34;如果下一个输入是上限。

问题是它等待下一次输入给打印A并且如果出现语法错误错误仍然打印A

我没有弄到有什么问题,有人会发现错误。

1 个答案:

答案 0 :(得分:1)

Bison需要一个“输入结束”标记来标记输入的结尾并返回一个成功的解析。通常,你在阅读EOF时给它这个标记(这是lex / flex将要做的)。因此,如果您在输入后输入EOF(通常通过按 ctrl D ctrl Z ),它应该工作