如何为每个规则野牛采取行动

how to give action for every rule bison

我正在尝试使用 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]

"caps" 是我的关键词

如果我将输入作为 "caps lock"(caps =KEYWORD 和 lock =VARIABLE) 我得到的输出是 "B"

如果我将输入作为大写,那么它会一直等到我输入下一个单词,并且在输入任何下一个单词后,如果下一个输入是大写,它会打印“Asyntax error”。

问题是它会等到下一个输入被提供给打印 A,如果出现语法错误,它仍然会打印 A

我没明白它有什么问题,谁能找出其中的错误。

Bison 需要一个 "end of input" 标记来标记输入的结束和 return 一个成功的解析。通常,你在读取 EOF 时给它这个标记(这是 lex/flex 会做的)。因此,如果您输入 EOF(通常通过点击 ctrlDctrlZ ) 输入后,它应该可以工作。