读取令牌时bison中出现语法错误
我有一个将由我的解析器读入的文件: test.txt读取令牌时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
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讲师在项目规范和测试程序中是这样拼写的。