Bison 词汇和语法分析器

Bison 词汇和语法分析器,bison,flex-lexer,Bison,Flex Lexer,我不擅长编写flex和bison程序。我试图制作一个简单的词汇和语法分析器。当我试图编译它们时,我有一个错误列表。 我应该如何声明标识符 Lexical.l.10: error: 'idf' undeclared <first use in this fucntion> Lexical.l.11: error: 'cst' undeclared <first use in this fucntion> Lexical.l.12: error: 'aff' undeclar

我不擅长编写flex和bison程序。我试图制作一个简单的词汇和语法分析器。当我试图编译它们时,我有一个错误列表。 我应该如何声明标识符

Lexical.l.10: error: 'idf' undeclared <first use in this fucntion>
Lexical.l.11: error: 'cst' undeclared <first use in this fucntion>
Lexical.l.12: error: 'aff' undeclared <first use in this fucntion>
Lexical.l.13: error: 'pvg' undeclared <first use in this fucntion>
Lexical.l.15: error: syntax error before '}' token

如果您在
Syntax.y
文件中正确定义了所有令牌,那么最有可能的情况是您在上次编辑
Syntax.y
后没有重新运行bison,或者在运行bison时没有指定正确的头文件名。在任何一种情况下,扫描仪中的
#include
语句都将拾取一个过时版本,其中令牌标识符具有不同的名称或不存在

最后一条错误消息:

Lexical.l.15: error: syntax error before '}' token
正确地指示您在此处遗漏了分号:

\n {nb++}
应该是

\n { nb++; }
[ \t]     ; /* Ignore spaces and tabs */
此外,flex要求规则具有操作,因此这是不正确的:

[ \n]
应该是

\n { nb++; }
[ \t]     ; /* Ignore spaces and tabs */

(分号是用来表示该操作不做任何事情的。注释只是为了使任何事情都不可见。)

欢迎使用SO!请不要发布图片链接,将错误文本复制到问题中。链接可能会随着时间的推移而下降,这使得应答者很难复制和粘贴您的代码。@ggorlen谢谢!现在我已经复制了错误文本和程序。感谢您的帮助。通常,bison会自动生成令牌标识符,并将其放入生成的头文件中。您似乎包含了bison生成的头文件:您不是在语法.y文件中声明令牌吗?@rici I我在语法.y文件中声明了令牌:%token idf cst aff pvg%%S:idf aff cst pvg{printf(“syntaxe correcate”);yyapt;};%%main(){yyparse();}yywrap();{}很好。上次编辑Syntax.y文件后是否运行bison?它不是自动的;如果不重新生成头文件,扫描仪将具有错误(或丢失)的令牌声明。(我强烈建议使用
make
来构建项目,因为很容易意外地遗漏构建步骤或以错误的顺序进行构建,从而导致各种模糊的bug和错误。)事实上,正如您所说,我的扫描仪拾取的是一个过时的版本。谢谢你的帮助