[英]Bison/Flex parsing issue
我正在使用 bison 和 flex,目前遇到了一些問題。 目前第一個字符被讀取並傳遞給 Bison,但立即拋出 yyerror()。 它應該打印 1,因為 'w' 是我的 Flex 規則定義的標識。
我無法確定問題的根源。 我沒有使用 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");};
%%
這是我的彈性語法:
{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
返回。 此外,這是未定義的行為,因為您沒有指定yylex
應該return
的值。 (使用-Wall
編譯可能會遇到這個問題。)
所以當掃描器讀取一個空格時,它會返回一些未指定的值給調用者( yyparse
)。 自然,這不會按預期工作。
改變(例如)
[ ] {return;}
至
[ ] ;
或者,更好的是,將冗余規則序列替換為
[[:space:]]+ ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.