我刚开始编写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
这是我的程序:
%{
#include"Syntax.tab.h"
int nb = 1;
%}
lettre [a-zA-Z]
chiffre [0-9]
IDF {lettre}({lettre}|{chiffre})*
cst {chiffre}+
%%
{IDF} return idf;
{cst} return cst;
= return aff;
; return pvg;
[ \t]
\n {nb++}
. printf("erreur lexicale a la ligne %d \n",nb);
%%
main()
{
yylex();
return 0;
}
答案 0 :(得分:3)
如果您在Syntax.y
文件中正确定义了所有令牌,则最有可能的原因是您上次编辑Syntax.y
后没有重新运行野牛,或者您未能指定野牛运行时正确的标头文件名。无论哪种情况,扫描仪中的#include
语句都将选择一个过时的版本,在该版本中,令牌标识符具有不同的名称或不存在。
最后一条错误消息:
Lexical.l.15: error: syntax error before '}' token
正确表示您在此处省略了分号:
\n {nb++}
应该是
\n { nb++; }
此外,flex要求规则具有操作,所以这是不正确的:
[ \n]
应该是
[ \t] ; /* Ignore spaces and tabs */
(要求使用分号表示该操作是什么都不做。只是在此处添加注释,以使其他内容不可见。)