Skip to content

Commit 302a07f

Browse files
committed
Get rid of uneccessary stacks and clear out yylval each lex
1 parent 3078552 commit 302a07f

File tree

2 files changed

+38
-102
lines changed

2 files changed

+38
-102
lines changed

parser/grammar.y

Lines changed: 36 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -9,61 +9,7 @@ import (
99
"github.com/ncw/gpython/ast"
1010
)
1111

12-
// FIXME what about when the lists (for example) are nested. Eg expr_or_star_exprs can nest.
13-
// - fix this by making exprs point into a thing under construction with a []Expr in it
14-
// - this will naturally recurse
15-
// OR just do a simple stack of them which we push, pop and append to the top item
16-
// will need the stack for stmts and exprs
17-
18-
// FIXME can put code blocks in not just at the end - help with list initialisation
19-
20-
// FIXME is the expStack needed at all? Aren't the yylval put into a
21-
// stack anyway by yacc? And in rsc cc he sets yylval to empty every
22-
// lex.
23-
24-
// A stack of []ast.Expr
25-
type exprsStack [][]ast.Expr
26-
27-
// Push a new []ast.Expr on the stack
28-
func (es *exprsStack) Push() {
29-
*es = append(*es, []ast.Expr{})
30-
}
31-
32-
// Pop the last []ast.Expr from the stack
33-
func (es *exprsStack) Pop() []ast.Expr {
34-
i := len(*es)-1
35-
e := (*es)[i]
36-
*es = (*es)[:i]
37-
return e
38-
}
39-
40-
// Add an ast.Expr to the the last []ast.Expr on the stack
41-
func (es *exprsStack) Add(expr ...ast.Expr) {
42-
i := len(*es)-1
43-
(*es)[i] = append((*es)[i], expr...)
44-
}
45-
46-
// A stack of []ast.Stmt
47-
type stmtsStack [][]ast.Stmt
48-
49-
// Push a new []ast.Stmt on the stack
50-
func (es *stmtsStack) Push() {
51-
*es = append(*es, []ast.Stmt{})
52-
}
53-
54-
// Pop the last []ast.Stmt from the stack
55-
func (es *stmtsStack) Pop() []ast.Stmt {
56-
i := len(*es)-1
57-
e := (*es)[i]
58-
*es = (*es)[:i]
59-
return e
60-
}
61-
62-
// Add an ast.Stmt to the the last []ast.Stmt on the stack
63-
func (es *stmtsStack) Add(stmt ...ast.Stmt) {
64-
i := len(*es)-1
65-
(*es)[i] = append((*es)[i], stmt...)
66-
}
12+
// NB can put code blocks in not just at the end
6713

6814
// Returns a Tuple if > 1 items or a trailing comma, otherwise returns
6915
// the first item in elts
@@ -78,35 +24,27 @@ func tupleOrExpr(pos ast.Pos, elts []ast.Expr, optional_comma bool) ast.Expr {
7824
%}
7925

8026
%union {
27+
pos ast.Pos // kept up to date by the lexer
8128
str string
8229
obj py.Object
83-
ast ast.Ast
8430
mod ast.Mod
8531
stmt ast.Stmt
86-
stmtsStack stmtsStack
8732
stmts []ast.Stmt
88-
pos ast.Pos // kept up to date by the lexer
89-
op ast.OperatorNumber
90-
cmpop ast.CmpOp
9133
expr ast.Expr
9234
exprs []ast.Expr
93-
exprsStack exprsStack
94-
trailers []ast.Expr // list of trailer expressions
35+
op ast.OperatorNumber
36+
cmpop ast.CmpOp
9537
comma bool
96-
comprehension ast.Comprehension
9738
comprehensions []ast.Comprehension
9839
}
9940

10041
%type <obj> strings
10142
%type <mod> inputs file_input single_input eval_input
102-
%type <stmts> simple_stmt stmt
103-
%type <stmtsStack> nl_or_stmt small_stmts stmts
43+
%type <stmts> simple_stmt stmt nl_or_stmt small_stmts stmts
10444
%type <stmt> compound_stmt small_stmt expr_stmt del_stmt pass_stmt flow_stmt import_stmt global_stmt nonlocal_stmt assert_stmt break_stmt continue_stmt return_stmt raise_stmt yield_stmt
10545
%type <op> augassign
10646
%type <expr> expr_or_star_expr expr star_expr xor_expr and_expr shift_expr arith_expr term factor power trailer atom test_or_star_expr test not_test lambdef test_nocond lambdef_nocond or_test and_test comparison testlist testlist_star_expr yield_expr_or_testlist yield_expr yield_expr_or_testlist_star_expr dictorsetmaker
107-
%type <exprs> exprlist testlistraw comp_if comp_iter
108-
%type <exprsStack> expr_or_star_exprs test_or_star_exprs tests test_colon_tests
109-
%type <trailers> trailers
47+
%type <exprs> exprlist testlistraw comp_if comp_iter expr_or_star_exprs test_or_star_exprs tests test_colon_tests trailers
11048
%type <cmpop> comp_op
11149
%type <comma> optional_comma
11250
%type <comprehensions> comp_for
@@ -236,20 +174,20 @@ single_input:
236174
file_input:
237175
nl_or_stmt ENDMARKER
238176
{
239-
$$ = &ast.Module{ModBase: ast.ModBase{$<pos>$}, Body: $1.Pop()}
177+
$$ = &ast.Module{ModBase: ast.ModBase{$<pos>$}, Body: $1}
240178
}
241179

242180
// (NEWLINE | stmt)*
243181
nl_or_stmt:
244182
{
245-
$$.Push()
183+
$$ = nil
246184
}
247185
| nl_or_stmt NEWLINE
248186
{
249187
}
250188
| nl_or_stmt stmt
251189
{
252-
$$.Add($2...)
190+
$$ = append($$, $2...)
253191
}
254192

255193
//eval_input: testlist NEWLINE* ENDMARKER
@@ -358,18 +296,18 @@ optional_semicolon: | ';'
358296
small_stmts:
359297
small_stmt
360298
{
361-
$$.Push()
362-
$$.Add($1)
299+
$$ = nil
300+
$$ = append($$, $1)
363301
}
364302
| small_stmts ';' small_stmt
365303
{
366-
$$.Add($3)
304+
$$ = append($$, $3)
367305
}
368306

369307
simple_stmt:
370308
small_stmts optional_semicolon NEWLINE
371309
{
372-
$$ = $1.Pop()
310+
$$ = $1
373311
}
374312

375313
small_stmt:
@@ -472,12 +410,12 @@ equals_yield_expr_or_testlist_star_expr:
472410
test_or_star_exprs:
473411
test_or_star_expr
474412
{
475-
$$.Push()
476-
$$.Add($1)
413+
$$ = nil
414+
$$ = append($$, $1)
477415
}
478416
| test_or_star_exprs ',' test_or_star_expr
479417
{
480-
$$.Add($3)
418+
$$ = append($$, $3)
481419
}
482420

483421
test_or_star_expr:
@@ -502,7 +440,7 @@ optional_comma:
502440
testlist_star_expr:
503441
test_or_star_exprs optional_comma
504442
{
505-
$$ = tupleOrExpr($<pos>$, $1.Pop(), $2)
443+
$$ = tupleOrExpr($<pos>$, $1, $2)
506444
}
507445

508446
augassign:
@@ -696,12 +634,12 @@ nonlocal_stmt:
696634
tests:
697635
test
698636
{
699-
$$.Push()
700-
$$.Add($1)
637+
$$ = nil
638+
$$ = append($$, $1)
701639
}
702640
| tests ',' test
703641
{
704-
$$.Add($3)
642+
$$ = append($$, $3)
705643
}
706644

707645
assert_stmt:
@@ -779,19 +717,19 @@ except_clause:
779717
stmts:
780718
stmt
781719
{
782-
$$.Push()
783-
$$.Add($1...)
720+
$$ = nil
721+
$$ = append($$, $1...)
784722
}
785723
| stmts stmt
786724
{
787-
$$.Add($2...)
725+
$$ = append($$, $2...)
788726
}
789727

790728
suite:
791729
simple_stmt
792730
| NEWLINE INDENT stmts DEDENT
793731
{
794-
// stmts.Pop()
732+
// stmts
795733
}
796734

797735
test:
@@ -1107,7 +1045,7 @@ atom:
11071045
}
11081046
| '(' test_or_star_exprs optional_comma ')'
11091047
{
1110-
$$ = tupleOrExpr($<pos>$, $2.Pop(), $3)
1048+
$$ = tupleOrExpr($<pos>$, $2, $3)
11111049
}
11121050
| '[' ']'
11131051
{
@@ -1119,7 +1057,7 @@ atom:
11191057
}
11201058
| '[' test_or_star_exprs optional_comma ']'
11211059
{
1122-
$$ = &ast.List{ExprBase: ast.ExprBase{$<pos>$}, Elts: $2.Pop(), Ctx: ast.Load}
1060+
$$ = &ast.List{ExprBase: ast.ExprBase{$<pos>$}, Elts: $2, Ctx: ast.Load}
11231061
}
11241062
| '{' '}'
11251063
{
@@ -1228,25 +1166,25 @@ expr_or_star_expr:
12281166
expr_or_star_exprs:
12291167
expr_or_star_expr
12301168
{
1231-
$$.Push()
1232-
$$.Add($1)
1169+
$$ = nil
1170+
$$ = append($$, $1)
12331171
}
12341172
| expr_or_star_exprs ',' expr_or_star_expr
12351173
{
1236-
$$.Add($3)
1174+
$$ = append($$, $3)
12371175
}
12381176

12391177
exprlist:
12401178
expr_or_star_exprs optional_comma
12411179
{
1242-
$$ = $1.Pop()
1180+
$$ = $1
12431181
$<comma>$ = $2
12441182
}
12451183

12461184
testlist:
12471185
tests optional_comma
12481186
{
1249-
elts := $1.Pop()
1187+
elts := $1
12501188
if $2 || len(elts) > 1 {
12511189
$$ = &ast.Tuple{ExprBase: ast.ExprBase{$<pos>$}, Elts: elts, Ctx: ast.Load}
12521190
} else {
@@ -1257,25 +1195,25 @@ testlist:
12571195
testlistraw:
12581196
tests optional_comma
12591197
{
1260-
$$ = $1.Pop()
1198+
$$ = $1
12611199
}
12621200

12631201
// (',' test ':' test)*
12641202
test_colon_tests:
12651203
test ':' test
12661204
{
1267-
$$.Push()
1268-
$$.Add($1, $3) // key, value order
1205+
$$ = nil
1206+
$$ = append($$, $1, $3) // key, value order
12691207
}
12701208
| test_colon_tests ',' test ':' test
12711209
{
1272-
$$.Add($3, $5)
1210+
$$ = append($$, $3, $5)
12731211
}
12741212

12751213
dictorsetmaker:
12761214
test_colon_tests optional_comma
12771215
{
1278-
keyValues := $1.Pop()
1216+
keyValues := $1
12791217
d := &ast.Dict{ExprBase: ast.ExprBase{$<pos>$}, Keys: nil, Values: nil}
12801218
for i := 0; i < len(keyValues)-1; i += 2 {
12811219
d.Keys = append(d.Keys, keyValues[i])
@@ -1285,7 +1223,6 @@ dictorsetmaker:
12851223
}
12861224
| test ':' test comp_for
12871225
{
1288-
// FIXME DictComp
12891226
$$ = &ast.DictComp{ExprBase: ast.ExprBase{$<pos>$}, Key: $1, Value: $3, Generators: $4}
12901227
}
12911228
| testlistraw
@@ -1294,7 +1231,6 @@ dictorsetmaker:
12941231
}
12951232
| test comp_for
12961233
{
1297-
// FIXME SetComp
12981234
$$ = &ast.SetComp{ExprBase: ast.ExprBase{$<pos>$}, Elt: $1, Generators: $2}
12991235
}
13001236

parser/lexer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ func (lts LexTokens) String() string {
331331
// The parser calls this method to get each new token. This
332332
// implementation returns operators and NUM.
333333
func (x *yyLex) Lex(yylval *yySymType) (ret int) {
334-
// FIXME rsc cc does this?
335-
// *yylval = yySymType{}
334+
// Clear out the yySymType on each token (copied from rsc's cc)
335+
*yylval = yySymType{}
336336
if yyDebug >= 2 {
337337
defer func() {
338338
lt := newLexToken(ret, yylval)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy