diff --git a/assignments/PA3/cool.y b/assignments/PA3/cool.y index f2a22a5..239ec7e 100644 --- a/assignments/PA3/cool.y +++ b/assignments/PA3/cool.y @@ -154,6 +154,7 @@ /* all other binary operations are left-associative * assignment is right-associative, * three comparison operations do not associate.*/ + %nonassoc LETEXPR %right ASSIGN %left NOT %nonassoc '<' LE '=' @@ -163,7 +164,6 @@ %nonassoc '~' %nonassoc '@' %nonassoc '.' - %left LETEXPR %% @@ -185,12 +185,14 @@ /* If no parent is specified, the class inherits from the Object class. */ class : CLASS TYPEID '{' feature_list '}' ';' - { $$ = class_($2,idtable.add_string("Object"),$4, - stringtable.add_string(curr_filename)); } + { $$ = class_($2,idtable.add_string("Object"),$4,stringtable.add_string(curr_filename)); } + | CLASS TYPEID '{' '}' ';' + { $$ = class_($2,idtable.add_string("Object"),nil_Features(),stringtable.add_string(curr_filename)); } | CLASS TYPEID INHERITS TYPEID '{' feature_list '}' ';' { $$ = class_($2,$4,$6,stringtable.add_string(curr_filename)); } | CLASS TYPEID INHERITS TYPEID '{' '}' ';' { $$ = class_($2,$4,nil_Features(),stringtable.add_string(curr_filename)); } + | CLASS error '{' error '}' ';' ; /* Feature list may be empty, but no empty features in list. */ @@ -202,6 +204,11 @@ feature : OBJECTID ':' TYPEID /* Use no expr where optional expression omitted*/ + /* The lineno for `no_expr` is somehow different from standard parser(std parser sets it to 0), + * if you want to perfektly conform to that, the code below provides a workaround + * { auto _lineno = @$; SET_NODELOC(0); auto _no_expr = no_expr(); SET_NODELOC(_lineno); $$ = attr($1, $3, _no_expr); } + * or you can modify cool-tree.h:754, manually override line_number to 0 + */ { $$ = attr($1, $3, no_expr()); } | OBJECTID ':' TYPEID ASSIGN expression { $$ = attr($1, $3, $5); } @@ -269,37 +276,37 @@ * there could be 2 interpretations: (let id1:T1 in expression).f() | let id1:T1 in (expression.f()) * This should be specified to dis-ambiguite * - * The manual says, the expr extends as far as possible + * The manual says, the expr extends as far as possible, so we just set the lowest precedence */ | LET nested_let { $$ = $2; } | CASE expression OF case_list ESAC { $$ = typcase($2, $4); } | NEW TYPEID - { $$ = new_($2); } + { SET_NODELOC(@2); $$ = new_($2); } | ISVOID expression - { $$ = isvoid($2); } + { SET_NODELOC(@2); $$ = isvoid($2); } /* the rules below need precedence specification */ | expression '+' expression - { $$ = plus($1, $3); } + { SET_NODELOC(@3); $$ = plus($1, $3); } | expression '-' expression - { $$ = sub($1, $3); } + { SET_NODELOC(@3); $$ = sub($1, $3); } | expression '*' expression - { $$ = mul($1, $3); } + { SET_NODELOC(@3); $$ = mul($1, $3); } | expression '/' expression - { $$ = divide($1, $3); } + { SET_NODELOC(@3); $$ = divide($1, $3); } | '~' expression - { $$ = neg($2); } + { SET_NODELOC(@2); $$ = neg($2); } | expression '<' expression - { $$ = lt($1, $3); } + { SET_NODELOC(@3); $$ = lt($1, $3); } | expression LE expression - { $$ = leq($1, $3); } + { SET_NODELOC(@3); $$ = leq($1, $3); } | expression '=' expression - { $$ = eq($1, $3); } + { SET_NODELOC(@3); $$ = eq($1, $3); } | NOT expression - { $$ = comp($2); } + { SET_NODELOC(@2); $$ = comp($2); } | '(' expression ')' - { $$ = $2; } + { SET_NODELOC(@2); $$ = $2; } | OBJECTID { $$ = object($1); } | INT_CONST diff --git a/assignments/PA3/myparser b/assignments/PA3/myparser index 8bfe2aa..42cad06 100755 --- a/assignments/PA3/myparser +++ b/assignments/PA3/myparser @@ -1,2 +1,2 @@ -#!/bin/csh -f +#!/bin/bash -f ./lexer $* | ./parser $* diff --git a/include/PA3/cool-tree.h b/include/PA3/cool-tree.h index d2312d2..0be1fa5 100644 --- a/include/PA3/cool-tree.h +++ b/include/PA3/cool-tree.h @@ -752,6 +752,7 @@ class no_expr_class : public Expression_class { protected: public: no_expr_class() { + line_number = 0; } Expression copy_Expression(); void dump(ostream& stream, int n);