error: expected identifier or ‘(’ before ‘=’ token

直译错误:在'='这个记号之前期待着有标识符或者'('

言外之意就是'='之前的那个符号不是标识符!也就是说可能被你错误定义成了修饰符、关键字这类的东西!

ps:为啥说or '( '。我是真的不晓得?

错误缘由:在Linux环境学习bison的基础知识。实现扫描一系列简单的等式,打印输出相关的信息。在从windows环境把写好的.l文件和.y文件传送过来到Linux环境之后,编译过程出现了错误!

错误再现:

gcc编译之时,出现报错:

error: expected identifier or ‘(’ before ‘=’ token_第1张图片

分析原因:定位到Name.l文件的第12行和第14行,显示yylval不是一个标识符?why?我们知道flex和bison交互协作进行词法/语法分析的过程是这样的:flex的词法分析器yylex()在扫描文本的过程中,根据设定好的规则,返回相应的记号(token)类型给bison的语法分析器yyparse(),而相应的记号值则存储给yylval这个变量中返回给parser()这一境界进行调用!yylval的数据类型是YYSTYPE类型的,YYSTYPE是一种宏定义类型,一般而言默认为int,不如我们如果想让yylval返回的类型是字符串char *),则可以在.l文件中声明"'#define YYSTYPE char*"(#define 目的类型 源类型),而在.y文件中也声明'#define YYSTYPE char*"。

打开Name.l文件,果然:

error: expected identifier or ‘(’ before ‘=’ token_第2张图片

yylval本该是一种变量,却声明称了固定的类型,怎么不会报错!本来人家需要一个名词,你却反手扔了一个形容词过来,怎么不会报错呀!!!!!!

引以为戒!

改正:将"#define yylval char*"改正为"#define YYSTYPE char*",解决运行!

不过还有个疑问,为啥报错提示说期待有个'(',这种情况对应的具体场景又是什么呀?

你可能感兴趣的:(编译原理)