Bison/Flex 解析问题
Bison/Flex parsing issue
我正在使用 bison 和 flex,目前遇到了一些问题。当前第一个字符被读取并传递给 Bison,但立即抛出 yyerror()。它应该打印 1,因为 'w' 是我的 Flex 规则定义的 Ident。
我无法确定问题的根源。我没有使用 Bison 的经验。
这是我的 bison 解析规则:
%%
Prog : StmtSeq {printf("13");};
StmtSeq : Stmt StmtSeq {printf("12");};
StmtSeq : {printf("11");};
Stmt : Id ':' Expr {printf("10");};
Expr : Expr '+' Term {printf("9");};
Expr : Term {printf("8");};
Term : Term '*' Factor {printf("7");};
Term : Factor {printf("6");};
Factor : '(' Expr ')' {printf("5");};
Factor : '{' Expr '}' {printf("4");};
Factor : Id {printf("3");};
Factor : SetLit {printf("2");};
Id : Ident {printf("1");};
%%
这是我的 flex 语法:
{letter} {return Ident;}
(\{\})|(\{{letter}(\,{letter})*\}) {return SetLit;}
\( {return '(';}
\) {return ')';}
\* {return '*';}
\+ {return '+';}
\{ {return '{';}
\} {return '}';}
\: {return ':';}
[ ] {return;}
\t {return;}
\r {return;}
\n {return;}
. {writeIndicator(getCurrentColumnNum()); writeMessage("Illegal Character in lex"); }
输入是一个 .txt 文件,其中包含:
w: {f,x,a,b,c,d,e}
x: {f,a,b,c,d,e}
y: {}
z: {x}
a: {f,x,a,b,c,d,e}
b: {}
如果您希望 lex 忽略一个记号,那么匹配该记号的模式应该什么也不做。 return
什么都不做;它导致 yylex
到 return。此外,这是未定义的行为,因为您没有指定 yylex
应该 return
的值。 (用 -Wall
编译可能会发现这个问题。)
因此,当扫描器读取 space 时,它 return 向调用者提供了一些未指定的值 (yyparse
)。当然,这并没有像预期的那样工作。
改变(例如)
[ ] {return;}
到
[ ] ;
或者,更好的是,将冗余规则序列替换为
[[:space:]]+ ;
我正在使用 bison 和 flex,目前遇到了一些问题。当前第一个字符被读取并传递给 Bison,但立即抛出 yyerror()。它应该打印 1,因为 'w' 是我的 Flex 规则定义的 Ident。
我无法确定问题的根源。我没有使用 Bison 的经验。
这是我的 bison 解析规则:
%%
Prog : StmtSeq {printf("13");};
StmtSeq : Stmt StmtSeq {printf("12");};
StmtSeq : {printf("11");};
Stmt : Id ':' Expr {printf("10");};
Expr : Expr '+' Term {printf("9");};
Expr : Term {printf("8");};
Term : Term '*' Factor {printf("7");};
Term : Factor {printf("6");};
Factor : '(' Expr ')' {printf("5");};
Factor : '{' Expr '}' {printf("4");};
Factor : Id {printf("3");};
Factor : SetLit {printf("2");};
Id : Ident {printf("1");};
%%
这是我的 flex 语法:
{letter} {return Ident;}
(\{\})|(\{{letter}(\,{letter})*\}) {return SetLit;}
\( {return '(';}
\) {return ')';}
\* {return '*';}
\+ {return '+';}
\{ {return '{';}
\} {return '}';}
\: {return ':';}
[ ] {return;}
\t {return;}
\r {return;}
\n {return;}
. {writeIndicator(getCurrentColumnNum()); writeMessage("Illegal Character in lex"); }
输入是一个 .txt 文件,其中包含:
w: {f,x,a,b,c,d,e}
x: {f,a,b,c,d,e}
y: {}
z: {x}
a: {f,x,a,b,c,d,e}
b: {}
如果您希望 lex 忽略一个记号,那么匹配该记号的模式应该什么也不做。 return
什么都不做;它导致 yylex
到 return。此外,这是未定义的行为,因为您没有指定 yylex
应该 return
的值。 (用 -Wall
编译可能会发现这个问题。)
因此,当扫描器读取 space 时,它 return 向调用者提供了一些未指定的值 (yyparse
)。当然,这并没有像预期的那样工作。
改变(例如)
[ ] {return;}
到
[ ] ;
或者,更好的是,将冗余规则序列替换为
[[:space:]]+ ;