我試圖在Pascal語言中創建一個非常簡單的YACC解析器,它只包含整數聲明,一些基本表達式和if-else語句。然而,我無法找到幾個小時的錯誤,我很快就會瘋狂。終端說Error at line:0
但它是不可能的!我使用flex和byacc解析器。如果你能幫助我,我會很高興。你可以看到這是我的lex文件;使用YACC解析時找不到一個簡單的錯誤
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern int yylval;
int linenum=0;
%}
digit [0-9]
letter [A-Za-z]
%%
if return IF;
then return THEN;
else return ELSE;
for return FOR;
while return WHILE;
PROGRAM return PROGRAM_SYM;
BEGIN return BEGIN_SYM;
VAR return VAR_SYM;
END return END_SYM;
INTEGER return INTEGER_SYM;
{letter}({letter}|{digit})* return identifier;
[0-9]+ return NUMBER;
[\<][\=] return CON_LE;
[\>][\=] return CON_GE;
[\=] return CON_EQ;
[\:][\=] return ASSIGNOP;
; return semiColon;
, return comma;
\n {linenum++;}
. return (int) yytext[0];
%%
,這是我的Yacc文件
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
extern FILE *yyin;
extern int linenum;
%}
%token PROGRAM_SYM VAR_SYM BEGIN_SYM END_SYM INTEGER_SYM NUMBER
%token identifier INTEGER ASSIGNOP semiColon comma THEN
%token IF ELSE FOR WHILE
%token CON_EQ CON_LE CON_GE GE LE
%left '*' '/'
%left '+' '-'
%start program
%%
program: PROGRAM_SYM identifier semiColon VAR_SYM dec_block BEGIN_SYM statement_list END_SYM '.'
;
dec_block:
dec_list semiColon;
dec_list:
dec_list dec
|
dec
;
dec:
int_dec_list
;
int_dec_list:
int_dec_list int_dec ':' type
|
int_dec ':' type
;
int_dec:
int_dec comma identifier
|
identifier
;
type:
INTEGER_SYM
;
statement_list:
statement_list statement
|
statement
;
statement:
assignment_list
|
expression_list
|
selection_list
;
assignment_list:
assignment_list assignment
|
assignment
;
assignment:
identifier ASSIGNOP expression_list
;
expression_list:
expression_list expression semiColon
|
expression semiColon
;
expression:
'(' expression ')'
|
expression '*' expression
|
expression '/' expression
|
expression '+' expression
|
expression '-' expression
|
factor
;
factor:
identifier
|
NUMBER
;
selection_list:
selection_list selection
|
selection
;
selection:
IF '(' logical_expression ')' THEN statement_list ELSE statement_list
;
logical_expression:
logical_expression '=' expression
|
logical_expression '>' expression
|
logical_expression '<' expression
;
%%
void yyerror(char *s){
fprintf(stderr,"Error at line: %d\n",linenum);
}
int yywrap(){
return 1;
}
int main(int argc, char *argv[])
{
/* Call the lexer, then quit. */
yyin=fopen(argv[1],"r");
yyparse();
fclose(yyin);
return 0;
}
最後我採取了錯誤的第一線時,我給的輸入;
PROGRAM myprogram;
VAR
i:INTEGER;
i3:INTEGER;
j:INTEGER;
BEGIN
i := 3;
j := 5;
i3 := i+j*2;
i := j*20;
if(i>j)
then i3 := i+50+(45*i+(40*j));
else i3 := i+50+(45*i+(40*j))+i+50+(45*i+(30*j));
END.
的哪個版本Yacc你在用嗎?當我用'bison'編譯你的代碼時,我得到'grammar.y:warning:3個無用的非終結符和7個無用的規則'和'grammar.y:衝突:8個shift/reduce'的警告(以及其間的特定錯誤消息) 。您是否打算在運行該程序之前解決其中的任何問題? (FWIW:當我運行程序時,儘管有警告,但我收到了同樣的錯誤信息) – 2012-03-24 22:38:51
它應該是'byacc',即使我得到13次轉換/減少衝突,它們不應該是一個問題原因,因爲我說它包含非常簡單的語法,並且它說'在第0行錯誤'。我甚至試圖寫樹形式,但無法實現的問題 – quartaela 2012-03-24 22:44:29
它是如此愚蠢,它給出了第0行的錯誤!我試圖解決這個小時,但沒有改善... – quartaela 2012-03-24 22:48:42