如何给行动为每个规则野牛

问题描述:

我试图用flex和野牛,使一个小的编译器,但我没有得到如何给行动为每个规则如何给行动为每个规则野牛

我的语法是这样的:

 %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]

“帽” 是我的关键字

如果我给输入为 “大写锁定”(帽= KEYWORD和锁= VARIABLE) 我是越来越outpu吨为“B”

如果我给输入作为帽然后它等待,直到我进入下一字和输入任何下一个字之后,如果下一个输入是帽打印“Asyntax错误”。

问题是它会等待,直到下一个输入是考虑到打印,它仍然打印出是否存在错误语法错误

我没有得到什么不对的地方有人可以发现其中的错误在里面。

+1

所以,你得到一个印,但不是B?这意味着你将关键字识别为东西,但显然不是变量。这个问题不在语法中 - 它在词法分析器中,你没有显示。您应该考虑在您的打印中添加换行符。 (这也很不寻常 - COBOL就像 - 使用'-'作为变量名称中的字符,你是否指'Z'和'0'之间的'_'?)你确定你可以打开词法诊断打印分析器,所以你可以看到令牌流返回到语法?如果可以的话,它会使生活更容易。 –

+0

如何打开在柔性印刷诊断和我没有在词法分析器打印任何东西 –

+0

你必须提供在Flex代码控制我如何添加一个换行符。它不是默认提供的。但是,能够查看词法分析器返回的内容通常可以帮助调试语法。 –

野牛需要一个令牌“输入的结束”来标记输入的结束并返回一个成功的解析。通常情况下,您在阅读EOF时将此标记赋予它(这是lex/flex将执行的操作)。所以,如果你输入一个EOF(通常通过点击CTRLdCTRLž)输入之后,它应该工作。

+0

如何从像呼应的空间和新的生产线的非匹配的输入停止野牛和为什么它只是回声对于空格和换行符,并为其他不匹配的ascii字符串提供语法错误。 –

+0

@JeevansaiJinne:野牛不会做无与伦比的输入回音;这是Flex的“工作”。它有一个默认的规则,回声匹配的文本不被任何其他规则捕获(大约'。+ {ECHO;}')。 –

+0

我怎么野牛正在打印地址 –