mirror of
https://github.com/golang/go
synced 2024-10-14 11:53:56 +00:00
optional semicolons
SVN=121604
This commit is contained in:
parent
f7753f1687
commit
8200a0b088
|
@ -530,6 +530,7 @@ Node* newcompat(Node*);
|
||||||
Node* stringop(Node*);
|
Node* stringop(Node*);
|
||||||
Node* convas(Node*);
|
Node* convas(Node*);
|
||||||
Node* reorder(Node*);
|
Node* reorder(Node*);
|
||||||
|
void arrayconv(Type*, Node*);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* const.c
|
* const.c
|
||||||
|
|
161
src/cmd/gc/go.y
161
src/cmd/gc/go.y
|
@ -30,12 +30,14 @@
|
||||||
%type <lint> chandir
|
%type <lint> chandir
|
||||||
%type <node> xdcl xdcl_list_r oxdcl_list common_dcl
|
%type <node> xdcl xdcl_list_r oxdcl_list common_dcl
|
||||||
%type <node> oarg_type_list arg_type_list_r arg_type
|
%type <node> oarg_type_list arg_type_list_r arg_type
|
||||||
%type <node> stmt empty_stmt else_stmt
|
%type <node> else_stmt1 else_stmt2
|
||||||
%type <node> complex_stmt compound_stmt stmt_list_r ostmt_list
|
%type <node> complex_stmt compound_stmt ostmt_list
|
||||||
|
%type <node> stmt_list_r Astmt_list_r Bstmt_list_r
|
||||||
|
%type <node> Astmt Bstmt Cstmt
|
||||||
%type <node> for_stmt for_body for_header
|
%type <node> for_stmt for_body for_header
|
||||||
%type <node> if_stmt if_body if_header
|
%type <node> if_stmt if_body if_header
|
||||||
%type <node> range_header range_body range_stmt
|
%type <node> range_header range_body range_stmt
|
||||||
%type <node> simple_stmt osimple_stmt
|
%type <node> simple_stmt osimple_stmt semi_stmt
|
||||||
%type <node> expr uexpr pexpr expr_list oexpr oexpr_list expr_list_r
|
%type <node> expr uexpr pexpr expr_list oexpr oexpr_list expr_list_r
|
||||||
%type <node> name name_name new_name new_name_list_r
|
%type <node> name name_name new_name new_name_list_r
|
||||||
%type <node> vardcl_list_r vardcl
|
%type <node> vardcl_list_r vardcl
|
||||||
|
@ -48,7 +50,7 @@
|
||||||
%type <node> fnres fnliteral xfndcl fndcl
|
%type <node> fnres fnliteral xfndcl fndcl
|
||||||
%type <node> keyval_list_r keyval
|
%type <node> keyval_list_r keyval
|
||||||
|
|
||||||
%type <type> type fntypeh fntype fnlitdcl intype new_type
|
%type <type> type fntypeh fntype fnlitdcl intype new_type typeconv
|
||||||
|
|
||||||
%left LOROR
|
%left LOROR
|
||||||
%left LANDAND
|
%left LANDAND
|
||||||
|
@ -206,40 +208,16 @@ typedcl:
|
||||||
dodcltype($1, $2);
|
dodcltype($1, $2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
else_stmt1:
|
||||||
* statements
|
complex_stmt
|
||||||
*/
|
| compound_stmt
|
||||||
stmt:
|
|
||||||
error ';'
|
else_stmt2:
|
||||||
|
simple_stmt
|
||||||
|
| semi_stmt
|
||||||
|
| ';'
|
||||||
{
|
{
|
||||||
$$ = N;
|
$$ = N;
|
||||||
context = nil;
|
|
||||||
}
|
|
||||||
| common_dcl ';'
|
|
||||||
{
|
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
| simple_stmt ';'
|
|
||||||
| complex_stmt
|
|
||||||
| compound_stmt
|
|
||||||
| empty_stmt
|
|
||||||
|
|
||||||
empty_stmt:
|
|
||||||
';'
|
|
||||||
{
|
|
||||||
$$ = nod(OEMPTY, N, N);
|
|
||||||
}
|
|
||||||
|
|
||||||
else_stmt:
|
|
||||||
stmt
|
|
||||||
{
|
|
||||||
$$ = $1;
|
|
||||||
switch($$->op) {
|
|
||||||
case OLABEL:
|
|
||||||
case OXCASE:
|
|
||||||
case OXFALL:
|
|
||||||
yyerror("statement cannot be labeled");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
simple_stmt:
|
simple_stmt:
|
||||||
|
@ -295,7 +273,7 @@ complex_stmt:
|
||||||
popdcl("if/switch");
|
popdcl("if/switch");
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
}
|
}
|
||||||
| LIF if_stmt LELSE else_stmt
|
| LIF if_stmt LELSE else_stmt1
|
||||||
{
|
{
|
||||||
popdcl("if/switch");
|
popdcl("if/switch");
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
|
@ -306,10 +284,6 @@ complex_stmt:
|
||||||
popdcl("range");
|
popdcl("range");
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
}
|
}
|
||||||
| LRETURN oexpr_list ';'
|
|
||||||
{
|
|
||||||
$$ = nod(ORETURN, $2, N);
|
|
||||||
}
|
|
||||||
| LCASE expr_list ':'
|
| LCASE expr_list ':'
|
||||||
{
|
{
|
||||||
// will be converted to OCASE
|
// will be converted to OCASE
|
||||||
|
@ -323,38 +297,50 @@ complex_stmt:
|
||||||
poptodcl();
|
poptodcl();
|
||||||
$$ = nod(OXCASE, N, N);
|
$$ = nod(OXCASE, N, N);
|
||||||
}
|
}
|
||||||
| LFALL ';'
|
| new_name ':'
|
||||||
|
{
|
||||||
|
$$ = nod(OLABEL, $1, N);
|
||||||
|
}
|
||||||
|
|
||||||
|
semi_stmt:
|
||||||
|
LFALL
|
||||||
{
|
{
|
||||||
// will be converted to OFALL
|
// will be converted to OFALL
|
||||||
$$ = nod(OXFALL, N, N);
|
$$ = nod(OXFALL, N, N);
|
||||||
}
|
}
|
||||||
| LBREAK oexpr ';'
|
| LBREAK oexpr
|
||||||
{
|
{
|
||||||
$$ = nod(OBREAK, $2, N);
|
$$ = nod(OBREAK, $2, N);
|
||||||
}
|
}
|
||||||
| LCONTINUE oexpr ';'
|
| LCONTINUE oexpr
|
||||||
{
|
{
|
||||||
$$ = nod(OCONTINUE, $2, N);
|
$$ = nod(OCONTINUE, $2, N);
|
||||||
}
|
}
|
||||||
| LGO pexpr '(' oexpr_list ')' ';'
|
| LGO pexpr '(' oexpr_list ')'
|
||||||
{
|
{
|
||||||
$$ = nod(OPROC, $2, $4);
|
$$ = nod(OPROC, $2, $4);
|
||||||
}
|
}
|
||||||
| LPRINT expr_list ';'
|
| LPRINT expr_list
|
||||||
{
|
{
|
||||||
$$ = nod(OPRINT, $2, N);
|
$$ = nod(OPRINT, $2, N);
|
||||||
}
|
}
|
||||||
| LPANIC oexpr_list ';'
|
| LPANIC oexpr_list
|
||||||
{
|
{
|
||||||
$$ = nod(OPANIC, $2, N);
|
$$ = nod(OPANIC, $2, N);
|
||||||
}
|
}
|
||||||
| LGOTO new_name ';'
|
| LGOTO new_name
|
||||||
{
|
{
|
||||||
$$ = nod(OGOTO, $2, N);
|
$$ = nod(OGOTO, $2, N);
|
||||||
}
|
}
|
||||||
| new_name ':'
|
| LRETURN oexpr_list
|
||||||
{
|
{
|
||||||
$$ = nod(OLABEL, $1, N);
|
$$ = nod(ORETURN, $2, N);
|
||||||
|
}
|
||||||
|
| LIF if_stmt LELSE else_stmt2
|
||||||
|
{
|
||||||
|
popdcl("if/switch");
|
||||||
|
$$ = $2;
|
||||||
|
$$->nelse = $4;
|
||||||
}
|
}
|
||||||
|
|
||||||
compound_stmt:
|
compound_stmt:
|
||||||
|
@ -657,11 +643,11 @@ pexpr:
|
||||||
// map literal
|
// map literal
|
||||||
$$ = N;
|
$$ = N;
|
||||||
}
|
}
|
||||||
| latype '(' oexpr_list ')'
|
| typeconv '(' oexpr_list ')'
|
||||||
{
|
{
|
||||||
// struct literal and conversions
|
// struct literal and conversions
|
||||||
$$ = nod(OCONV, $3, N);
|
$$ = nod(OCONV, $3, N);
|
||||||
$$->type = $1->otype;
|
$$->type = $1;
|
||||||
}
|
}
|
||||||
| LCONVERT '(' type ',' expr ')'
|
| LCONVERT '(' type ',' expr ')'
|
||||||
{
|
{
|
||||||
|
@ -738,6 +724,32 @@ name:
|
||||||
$$ = oldname($1);
|
$$ = oldname($1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typeconv:
|
||||||
|
latype
|
||||||
|
{
|
||||||
|
$$ = oldtype($1);
|
||||||
|
}
|
||||||
|
| '[' ']' typeconv
|
||||||
|
{
|
||||||
|
$$ = aindex(N, $3);
|
||||||
|
}
|
||||||
|
| LCHAN chandir typeconv
|
||||||
|
{
|
||||||
|
$$ = typ(TCHAN);
|
||||||
|
$$->type = $3;
|
||||||
|
$$->chan = $2;
|
||||||
|
}
|
||||||
|
| LMAP '[' typeconv ']' typeconv
|
||||||
|
{
|
||||||
|
$$ = typ(TMAP);
|
||||||
|
$$->down = $3;
|
||||||
|
$$->type = $5;
|
||||||
|
}
|
||||||
|
| LANY
|
||||||
|
{
|
||||||
|
$$ = typ(TANY);
|
||||||
|
}
|
||||||
|
|
||||||
type:
|
type:
|
||||||
latype
|
latype
|
||||||
{
|
{
|
||||||
|
@ -1046,15 +1058,48 @@ arg_type_list_r:
|
||||||
$$ = nod(OLIST, $1, $3);
|
$$ = nod(OLIST, $1, $3);
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt_list_r:
|
Astmt:
|
||||||
stmt
|
complex_stmt
|
||||||
{
|
|
||||||
$$ = $1;
|
Bstmt:
|
||||||
}
|
semi_stmt
|
||||||
| stmt_list_r stmt
|
| common_dcl
|
||||||
|
|
||||||
|
Cstmt:
|
||||||
|
simple_stmt
|
||||||
|
|
||||||
|
Astmt_list_r:
|
||||||
|
Astmt
|
||||||
|
| Astmt_list_r Astmt
|
||||||
{
|
{
|
||||||
$$ = nod(OLIST, $1, $2);
|
$$ = nod(OLIST, $1, $2);
|
||||||
}
|
}
|
||||||
|
| Bstmt_list_r ';'
|
||||||
|
| Astmt_list_r ';'
|
||||||
|
| ';'
|
||||||
|
{
|
||||||
|
$$ = N;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bstmt_list_r:
|
||||||
|
Bstmt
|
||||||
|
| Cstmt
|
||||||
|
| Bstmt_list_r Bstmt
|
||||||
|
{
|
||||||
|
$$ = nod(OLIST, $1, $2);
|
||||||
|
}
|
||||||
|
| Astmt_list_r Cstmt
|
||||||
|
{
|
||||||
|
$$ = nod(OLIST, $1, $2);
|
||||||
|
}
|
||||||
|
| Astmt_list_r Bstmt
|
||||||
|
{
|
||||||
|
$$ = nod(OLIST, $1, $2);
|
||||||
|
}
|
||||||
|
|
||||||
|
stmt_list_r:
|
||||||
|
Astmt_list_r
|
||||||
|
| Bstmt_list_r
|
||||||
|
|
||||||
expr_list_r:
|
expr_list_r:
|
||||||
expr
|
expr
|
||||||
|
|
|
@ -264,6 +264,7 @@ loop:
|
||||||
}
|
}
|
||||||
|
|
||||||
// simple fix-float
|
// simple fix-float
|
||||||
|
if(n->left->type != T)
|
||||||
if(isint[n->left->type->etype] || isfloat[n->left->type->etype])
|
if(isint[n->left->type->etype] || isfloat[n->left->type->etype])
|
||||||
if(isint[n->type->etype] || isfloat[n->type->etype]) {
|
if(isint[n->type->etype] || isfloat[n->type->etype]) {
|
||||||
evconst(n);
|
evconst(n);
|
||||||
|
@ -283,6 +284,11 @@ loop:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(n->type->etype == TARRAY) {
|
||||||
|
arrayconv(n->type, n->left);
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
|
||||||
badtype(n->op, n->left->type, n->type);
|
badtype(n->op, n->left->type, n->type);
|
||||||
goto ret;
|
goto ret;
|
||||||
|
|
||||||
|
@ -1276,3 +1282,31 @@ reorder(Node *n)
|
||||||
{
|
{
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
arrayconv(Type *t, Node *n)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
Iter save;
|
||||||
|
Node *l;
|
||||||
|
|
||||||
|
l = listfirst(&save, &n);
|
||||||
|
c = 0;
|
||||||
|
|
||||||
|
loop:
|
||||||
|
if(l == N) {
|
||||||
|
if(t->bound == 0)
|
||||||
|
t->bound = c;
|
||||||
|
if(t->bound == 0 || t->bound < c)
|
||||||
|
yyerror("error with array convert bounds");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c++;
|
||||||
|
walktype(l, 0);
|
||||||
|
convlit(l, t->type);
|
||||||
|
if(!ascompat(l->type, t->type))
|
||||||
|
badtype(OARRAY, l->type, t->type);
|
||||||
|
l = listnext(&save);
|
||||||
|
goto loop;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue