%token ident %token num %token charconst %token string %token INT %token CHAR %token VOID %token COUT %token CIN %token CLASS %token PUBLIC %token PRIVATE %token IF %token ELSE %token WHILE %token FOR %token RETURN %token BREAK %token IN %token OUT %token LE %token NE %token GE %token EE %token AND %token OR %token INS %left OR AND %left '<' '>' '=' NE GE LE EE %left '+' '-' %left '*' '/' '%' %left UOP '!' %expect 1 %{ #include "lex.yy.c" %} %% Start : Gitem | Start Gitem ; Gitem : CLASS ident '{' Classbody '}' | VOID ident '(' Plist | Type Optstar ident Girest | error ';' {printf("at line no:%d\n",line);} | error '}' {printf("at line no:%d\n",line);} ; Type : INT | CHAR | ident ; Optstar : /* empty */ | '*' Optstar ; Girest : Optarray Vardecl | '(' Plist ; Optarray : /* empty */ | '[' num ']' | '[' error ']' {printf("at line no:%d\n",line);} | '[' num error {printf("at line no:%d\n",line);} ; Vardecl : ';' | ',' Optstar ident Optarray Vardecl ; Fplist : ')' '{' Body '}' | Fplist1 '{' Body '}' | error '{'Body '}' {printf(" at line no:%d\n",line);yyerrok;} ; Fplist1 : Type Optstar ident ')' | Type Optstar ident ',' Fplist1 | error ')' {printf(" at line no:%d\n",line);yyerrok;} ; Plist : ')' ';' | Fplist | Fplist1 ';' | Type Optstar ')' ';' | Type Optstar ',' Type Optstar Pl1 ')' ';' | Type Optstar ',' Type Optstar Pl1 ident Pl3 ')' ';' | Type Optstar ident ',' Type Optstar Pl2 Pl3 ')' ';' ; Pl1 : /* empty */ | ',' Type Optstar Pl1 ; Pl2 : /* empty */ | ident ',' Type Optstar Pl2 ; Pl3 : /* empty */ | ',' Type Optstar Optident Pl3 ; Optident : /*empty */ | ident ; /*Forp : ';' | '{' Body '}' ;*/ Pplist : ')' ';' | Type Optstar Optident Pl3 ')' ';' ; Classbody : Citem | Classbody Citem ; Citem : Optscope VOID ident '(' Fplist | Optscope Type Optstar ident Cirest ; Optscope : /* empty */ | PUBLIC ':' | PRIVATE ':' ; Cirest : Optarray Vardecl | '(' Fplist ; Body : Bitem | Body Bitem ; Bitem : VOID ident '(' Pplist | Type Optstar ident '(' Pplist | Type Optstar ident Optarray Vardecl | Statement ; Statement : ';' | Lhsid '=' Expr ';' | Lhsid '(' Cplist ';' | IF '(' Expr ')' Statement | IF '(' Expr ')' Statement ELSE Statement | WHILE '(' Expr ')' Statement | RETURN Rexpr ';' | COUT Couts ';' | CIN Cins ';' | '{' Stlist '}' | BREAK ';' | error ';' { printf("error at line no:%d\n",line); yyerrok; } ; Rexpr : Expr | ; Stlist : /* empty */ | Statement Stlist ; Cplist : ')' | Cplist1 Cplist1 : Expr ')' | Expr ',' Cplist1 Lhsid : Lhsid1| '*' Lhsid Lhsid1 : Lhsid1 INS Lhsbase | Lhsid1 '.' Lhsbase | Lhsbase Lhsbase : ident | ident '[' Expr ']' ; Couts : /* empty */ | OUT Expr Couts ; Cins : /* empty */ | IN Lhsid Cins ; Expr : Expr OR Expr1 | Expr1 ; Expr1 : Expr1 AND Expr2 | Expr2 ; Expr2 : Expr2 EE Expr3 | Expr2 NE Expr3 | Expr3 ; Expr3 : Expr3 '<' Expr4 | Expr3 LE Expr4 | Expr3 '>' Expr4 | Expr3 GE Expr4 | Expr4 ; Expr4 : Expr4 '+' Expr5 | Expr4 '-' Expr5 | Expr5 ; Expr5 : Expr5 '*' Expr6 | Expr5 '/' Expr6 | Expr5 '%' Expr6 | Expr6 ; Expr6 : '!' Expr7 | '+' Expr7 %prec UOP | '-' Expr7 %prec UOP | Expr7 ; Expr7 : '(' Expr ')' | Lhsid '(' Cplist | Lhsid | '&' Lhsid | num | charconst | string | error {printf("at line no:%d\n",line);} ; %%