0

我正在尝试使用 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 =KEYWORD 和 lock =VARIABLE),我得到的输出是“B”

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

问题是它会等到下一个输入给出打印 A 并且如果存在语法错误的错误,它仍然会打印 A

我没有得到它有什么问题,有人可以找到它的错误。

4

1 回答 1

1

Bison 需要一个“输入结束”标记来标记输入的结束并返回成功的解析。通常,您在读取 ​​EOF 时给它这个标记(这就是 lex/flex 将做的)。因此,如果您在输入后输入 EOF(通常通过点击ctrlDor ctrlZ),它应该可以工作。

于 2017-04-15T20:49:55.123 回答