如何为每个规则野牛采取行动
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(通常通过点击 ctrlD 或 ctrlZ ) 输入后,它应该可以工作。
我正在尝试使用 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(通常通过点击 ctrlD 或 ctrlZ ) 输入后,它应该可以工作。