|
|
|
@ -62,9 +62,205 @@ func (parser *Parser) parseCompoundStatement() *ast.CompoundStatement { |
|
|
|
return compoundStmt |
|
|
|
} |
|
|
|
|
|
|
|
// atom: ('(' [yield_expr|testlist_comp] ')' |
|
|
|
|
// '[' [testlist_comp] ']' |
|
|
|
|
// '{' [dictorsetmaker] '}' |
|
|
|
|
// NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
|
|
|
|
func (parser *Parser) parseAtom() *ast.Atom { |
|
|
|
atom := ast.NewAtom() |
|
|
|
next := parser.nextToken() |
|
|
|
switch next.ID { |
|
|
|
case token.NAME, token.NUMBER, token.ELLIPSIS: |
|
|
|
atom.Append(ast.NewTokenNode(next)) |
|
|
|
case token.STRING: |
|
|
|
atom.Append(ast.NewTokenNode(next)) |
|
|
|
for { |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID != token.STRING { |
|
|
|
parser.unreadToken(next) |
|
|
|
break |
|
|
|
} |
|
|
|
atom.Append(ast.NewTokenNode(next)) |
|
|
|
} |
|
|
|
} |
|
|
|
return atom |
|
|
|
} |
|
|
|
|
|
|
|
// trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
|
|
|
|
func (parser *Parser) parseTrailer() *ast.Trailer { |
|
|
|
trailer := ast.NewTrailer() |
|
|
|
next := parser.nextToken() |
|
|
|
switch next.ID { |
|
|
|
case token.LPAR: |
|
|
|
next2 := parser.nextToken() |
|
|
|
if next2.ID != token.RPAR { |
|
|
|
return nil |
|
|
|
} |
|
|
|
trailer.Append(ast.NewTokenNode(next)) |
|
|
|
trailer.Append(ast.NewTokenNode(next2)) |
|
|
|
case token.LBRACE: |
|
|
|
next2 := parser.nextToken() |
|
|
|
if next2.ID != token.RBRACE { |
|
|
|
return nil |
|
|
|
} |
|
|
|
trailer.Append(ast.NewTokenNode(next)) |
|
|
|
trailer.Append(ast.NewTokenNode(next2)) |
|
|
|
case token.DOT: |
|
|
|
next2 := parser.nextToken() |
|
|
|
if next2.ID == token.NAME { |
|
|
|
trailer.Append(ast.NewTokenNode(next)) |
|
|
|
trailer.Append(ast.NewTokenNode(next2)) |
|
|
|
} else { |
|
|
|
parser.addError("Expected \"NAME\" instead found \"" + next.ID.String() + "\"") |
|
|
|
return nil |
|
|
|
} |
|
|
|
default: |
|
|
|
parser.unreadToken(next) |
|
|
|
return nil |
|
|
|
} |
|
|
|
return trailer |
|
|
|
} |
|
|
|
|
|
|
|
// atom_expr: [AWAIT] atom trailer*
|
|
|
|
func (parser *Parser) parseAtomExpression() *ast.AtomExpression { |
|
|
|
expr := ast.NewAtomExpression() |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID == token.AWAIT { |
|
|
|
expr.Append(ast.NewTokenNode(next)) |
|
|
|
} else { |
|
|
|
parser.unreadToken(next) |
|
|
|
} |
|
|
|
|
|
|
|
atom := parser.parseAtom() |
|
|
|
if atom == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
expr.Append(atom) |
|
|
|
for { |
|
|
|
trailer := parser.parseTrailer() |
|
|
|
if trailer == nil { |
|
|
|
break |
|
|
|
} |
|
|
|
expr.Append(trailer) |
|
|
|
} |
|
|
|
|
|
|
|
return expr |
|
|
|
} |
|
|
|
|
|
|
|
// power: atom_expr ['**' factor]
|
|
|
|
func (parser *Parser) parsePower() *ast.Power { |
|
|
|
power := ast.NewPower() |
|
|
|
atomExpr := parser.parseAtomExpression() |
|
|
|
if atomExpr == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
power.Append(atomExpr) |
|
|
|
|
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID == token.DOUBLESTAR { |
|
|
|
factor := parser.parseFactor() |
|
|
|
if factor == nil { |
|
|
|
return nil |
|
|
|
} else { |
|
|
|
power.Append(factor) |
|
|
|
} |
|
|
|
} else { |
|
|
|
parser.unreadToken(next) |
|
|
|
} |
|
|
|
return power |
|
|
|
} |
|
|
|
|
|
|
|
// factor: ('+'|'-'|'~') factor | power
|
|
|
|
func (parser *Parser) parseFactor() *ast.Factor { |
|
|
|
factor := ast.NewFactor() |
|
|
|
next := parser.nextToken() |
|
|
|
switch next.ID { |
|
|
|
case token.PLUS, token.MINUS, token.TILDE: |
|
|
|
node := parser.parseFactor() |
|
|
|
if node == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
factor.Append(ast.NewTokenNode(next)) |
|
|
|
factor.Append(node) |
|
|
|
default: |
|
|
|
parser.unreadToken(next) |
|
|
|
power := parser.parsePower() |
|
|
|
if power == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
factor.Append(power) |
|
|
|
} |
|
|
|
|
|
|
|
return factor |
|
|
|
} |
|
|
|
|
|
|
|
// term: factor (('*'|'@'|'/'|'%'|'//') factor)*
|
|
|
|
func (parser *Parser) parseTerm() *ast.Term { |
|
|
|
term := ast.NewTerm() |
|
|
|
factor := parser.parseFactor() |
|
|
|
if factor == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
term.Append(factor) |
|
|
|
for { |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID != token.STAR && next.ID != token.AMPER && next.ID != token.SLASH && next.ID != token.PERCENT && next.ID != token.DOUBLESLASH { |
|
|
|
parser.unreadToken(next) |
|
|
|
break |
|
|
|
} |
|
|
|
factor := parser.parseFactor() |
|
|
|
if factor == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
term.Append(factor) |
|
|
|
} |
|
|
|
return term |
|
|
|
} |
|
|
|
|
|
|
|
// arith_expr: term (('+'|'-') term)*
|
|
|
|
func (parser *Parser) parseArithmetricExpression() *ast.ArithmeticExpression { |
|
|
|
expr := ast.NewArithmeticExpression() |
|
|
|
term := parser.parseTerm() |
|
|
|
if term == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
expr.Append(term) |
|
|
|
for { |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID != token.PLUS || next.ID != token.MINUS { |
|
|
|
parser.unreadToken(next) |
|
|
|
break |
|
|
|
} |
|
|
|
term := parser.parseTerm() |
|
|
|
if term == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
expr.Append(term) |
|
|
|
} |
|
|
|
return expr |
|
|
|
} |
|
|
|
|
|
|
|
// shift_expr: arith_expr (('<<'|'>>') arith_expr)*
|
|
|
|
func (parser *Parser) parseShiftExpression() *ast.ShiftExpression { |
|
|
|
expr := ast.NewShiftExpression() |
|
|
|
arithExpr := parser.parseArithmetricExpression() |
|
|
|
if arithExpr == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
expr.Append(arithExpr) |
|
|
|
for { |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID != token.LEFTSHIFT && next.ID != token.RIGHTSHIFT { |
|
|
|
parser.unreadToken(next) |
|
|
|
break |
|
|
|
} |
|
|
|
expr.Append(ast.NewTokenNode(next)) |
|
|
|
arithExpr := parser.parseArithmetricExpression() |
|
|
|
if arithExpr == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
expr.Append(arithExpr) |
|
|
|
} |
|
|
|
return expr |
|
|
|
} |
|
|
|
|
|
|
|
@ -199,6 +395,7 @@ func (parser *Parser) parseNotTest() *ast.NotTest { |
|
|
|
} |
|
|
|
notTest.SetChild(test) |
|
|
|
} else { |
|
|
|
parser.unreadToken(next) |
|
|
|
comparison := parser.parseComparison() |
|
|
|
if comparison == nil { |
|
|
|
return nil |
|
|
|
@ -302,11 +499,29 @@ func (parser *Parser) parseTestlistStarExpression() *ast.TestlistStarExpression |
|
|
|
// ('=' (yield_expr|testlist_star_expr))*)
|
|
|
|
func (parser *Parser) parseExpressionStatement() *ast.ExpressionStatement { |
|
|
|
exprStmt := ast.NewExpressionStatement() |
|
|
|
testlistStarExpression := parser.parseTestlistStarExpression() |
|
|
|
if testlistStarExpression == nil { |
|
|
|
expr := parser.parseTestlistStarExpression() |
|
|
|
if expr == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
exprStmt.SetChild(testlistStarExpression) |
|
|
|
exprStmt.Append(expr) |
|
|
|
|
|
|
|
if false { |
|
|
|
} else { |
|
|
|
for { |
|
|
|
next := parser.nextToken() |
|
|
|
if next.ID != token.EQUAL { |
|
|
|
parser.unreadToken(next) |
|
|
|
break |
|
|
|
} |
|
|
|
exprStmt.Append(ast.NewTokenNode(next)) |
|
|
|
expr := parser.parseTestlistStarExpression() |
|
|
|
if expr == nil { |
|
|
|
return nil |
|
|
|
} |
|
|
|
exprStmt.Append(expr) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return exprStmt |
|
|
|
} |
|
|
|
|
|
|
|
|