Skip to content

Commit

Permalink
Merge pull request #2105 from xushiwei/q
Browse files Browse the repository at this point in the history
pseudo: DECLARE multiple var name once
  • Loading branch information
xushiwei authored Feb 14, 2025
2 parents 4ad6eb0 + 502d7d5 commit 8a109dd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 15 deletions.
6 changes: 3 additions & 3 deletions demo/gop-parser/pseudo/ast.gop
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ type EmptyStmt struct {

// VarStmt - 变量声明语句
//
// DECLARE {变量名} : {类型}
// DECLARE {变量名1}, {变量名2}... : {类型}
type VarStmt struct {
Name string
Type Type
Names []string
Type Type
}

// ConstStmt - 常量声明语句
Expand Down
4 changes: 1 addition & 3 deletions demo/gop-parser/pseudo/gauss.pseudo
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
DECLARE n : INTEGER
DECLARE i : INTEGER
DECLARE sum : INTEGER
DECLARE n, i, sum : INTEGER
OUTPUT "please input n:"
INPUT n
i <- 1
Expand Down
21 changes: 16 additions & 5 deletions demo/gop-parser/pseudo/parser.gop
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,24 @@ func parseExpr(expr string) ast.Expr {

// VarStmt - 变量声明语句
//
// DECLARE {变量名} : {类型}
// DECLARE {变量名1}, {变量名2}... : {类型}
func parseVarStmt(rest string, lines []string) (Stmt, []string) {
s := scanner.new(rest, nil, 0)
_, name := expect(s, token.IDENT) // {变量名}
expect(s, token.COLON) // :
typ := parseType(s) // {类型}
return &VarStmt{Name: name, Type: typ}, lines[1:]
var names []string
for {
_, name := expect(s, token.IDENT) // {名称}
names = append(names, name)
_, tok, _ := s.scan()
if tok == token.COMMA { // ,
continue
} else if tok == token.COLON { // :
break
} else {
panic("DECLARE: expect , or :")
}
}
typ := parseType(s) // {类型}
return &VarStmt{Names: names, Type: typ}, lines[1:]
}

func parseNameAndValue(rest string) (string, ast.Expr) {
Expand Down
9 changes: 5 additions & 4 deletions demo/gop-parser/pseudo/state.gox
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,12 @@ func execStmt(stmt Stmt) {
}

func execVarStmt(stmt *VarStmt) {
name := stmt.Name
if _, ok := vars[name]; ok {
panic("variable `${name}` already declared")
for name <- stmt.Names {
if _, ok := vars[name]; ok {
panic("variable `${name}` already declared")
}
vars[name] = zero(stmt.Type)
}
vars[name] = zero(stmt.Type)
}

func execConstStmt(stmt *ConstStmt) {
Expand Down

0 comments on commit 8a109dd

Please sign in to comment.