词法和语法分析器

时间:2018-11-27 23:25:49

标签: 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' 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;
    }

1 个答案:

答案 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 */

(要求使用分号表示该操作是什么都不做。只是在此处添加注释,以使其他内容不可见。)