读取令牌时bison中出现语法错误

读取令牌时bison中出现语法错误,bison,flex-lexer,yacc,lex,lexical-analysis,Bison,Flex Lexer,Yacc,Lex,Lexical Analysis,我有一个将由我的解析器读入的文件: test.txt BEGINING. XXX XY-1. XXXX Y. XXXX Z. BODY. PRINT "Please enter a number?". END. 错误发生在打印标记周围。在我的词法分析器中,字符串“请输入一个数字?”被正确处理,我知道这一点,因为我将其输出到控制台 莱克瑟,我 %{ #include <stdio.h> #include "parser.tab.h" #define YYSTYPE ch

我有一个将由我的解析器读入的文件:

test.txt

BEGINING.

XXX XY-1.

XXXX Y.

XXXX Z.

BODY.

PRINT "Please enter a number?".

END.
错误发生在
打印
标记周围。在我的词法分析器中,字符串
“请输入一个数字?”
被正确处理,我知道这一点,因为我将其输出到控制台

莱克瑟,我

%{
#include <stdio.h>

#include "parser.tab.h"
#define YYSTYPE char *
%}

%option noyywrap 
%option caseless

%%

(?i:BEGINING) return TERM_BEGINING;
(?i:BODY) return TERM_BODY;
(?i:END) return TERM_END;
(?i:MOVE) return TERM_MOVE;
(?i:TO) return TERM_TO;
(?i:ADD) return TERM_ADD;
(?i:INPUT) return TERM_INPUT;
(?i:PRINT) return TERM_PRINT;


[\t| ]+ // ignore whitespaces

\n // Ignore new line

[X]+ yylval.integer = yyleng; return TERM_SIZE;

[\"][^"]*[\"] yylval.string = strdup(yytext); printf("%s\n", yytext); return TERM_STR;

";" return TERM_SEPARATOR;

"." return TERM_FULLSTOP;

[0-9]+ yylval.integer = atoi(yytext); return TERM_INT;

[\_\-0-9][a-zA-Z][a-zA-Z0-9\-\_]* yylval.string = strdup(yytext); return TERM_INVALID_VARIABLE_NAME;

[A-Z][A-Z0-9\-]* yylval.string = strdup(yytext); return TERM_VARIABLE_NAME;

. return TERM_INVALID_TOKEN;

%%

//int main(int argc, char** argv) {
//  if (argc != 2) {
//      yyin = stdin;
//      yylex();
//  } else {
//      FILE* aFile = fopen(argv[1], "r");
//      if (!aFile) {
//          printf("Cannot open file!\n");
//          return -1;
//      } else {
//          yyin = aFile;
//          yylex();
//          fclose(yyin);
//      }
//  }
//}
我就是这样编译的

bison -d parser.y -o parser.tab.c
flex -o lexer.yy.c lexer.I
gcc lexer.yy.c parser.tab.c -o parser
这就是我跑步的方式

./parser test.txt
这就是我得到的输出

SIZE: 3 // this is output from the createVar function
NAME: XY-1
Success : Created variable succesfully

SIZE: 4
NAME: Y
Success : Created variable succesfully

SIZE: 4
NAME: Z
Success : Created variable succesfully

"Please enter a number?" // This is output for debugging from the lexer
PRINT // This is output for debugging from the parser,
syntax error
省略动作(不改变语法)您的
其他打印规则是:

other_print:
    TERM_VARIABLE_NAME TERM_INVALID_VARIABLE_NAME TERM_SEPARATOR TERM_STR
输入文件中不存在这种奇怪的端子序列,因此产品将不匹配,从而导致语法错误报告

看起来你不太可能真的想要这种语法;我的猜测是,您打算将四个端子作为替代品,而不是串联。如果是这样,则需要使用
|
s将它们分开

other\u input
也有类似问题。

忽略操作(不会更改语法)您的
other\u print
规则是:

other_print:
    TERM_VARIABLE_NAME TERM_INVALID_VARIABLE_NAME TERM_SEPARATOR TERM_STR
输入文件中不存在这种奇怪的端子序列,因此产品将不匹配,从而导致语法错误报告

看起来你不太可能真的想要这种语法;我的猜测是,您打算将四个端子作为替代品,而不是串联。如果是这样,则需要使用
|
s将它们分开


other\u input
也有类似的问题。

我认为您的
other\u input
other\u print
产品中缺少了
。@rici谢谢,我在other\u print的其中一个产品中缺少了
,顺便说一句,您的字符类中没有任何
符号是必要的,我怀疑你的意思是否真的是
[\t |]
,因为
不是一个空格字符。@rici我的想法是
将作为OR。因此,可能是制表符或空格被忽略了。@EJP这是讲师在项目规范和测试程序中拼写它的方式。我认为您在您的
其他输入
其他打印
产品中缺少了
s。@rici谢谢,我错过了另一本印刷品中的一部作品顺便说一句,你的角色类中的
\
符号都是不必要的,我怀疑你的意思是否是
[\t\124;]
,因为
不是空白字符。@rici我的想法是
将作为OR。所以被忽略的可能是制表符或空格。@EJP讲师在项目规范和测试程序中是这样拼写的。