浏览代码

разбираюсь с парсером

kpmy 10 年之前
父节点
当前提交
cda74a2c8a
共有 4 个文件被更改,包括 25 次插入7 次删除
  1. 7 5
      rt2/rules/expect.go
  2. 10 1
      rt2/rules/return.go
  3. 1 1
      rt2/rules/table.go
  4. 7 0
      rt2/scope/modern/val.go

+ 7 - 5
rt2/rules/expect.go

@@ -60,12 +60,14 @@ func expectExpr(parent frame.Frame, expr node.Node, next Do) OUT {
 		rt2.Assert(parent, func(f frame.Frame) (bool, int) {
 			return rt2.ValueOf(f)[e.Adr()] != nil, 64
 		})
-		wait := func(...IN) OUT {
+		wait := func(in ...IN) OUT {
 			idx := rt2.ValueOf(parent)[e.Adr()]
-			arr := sm.Select(e.Left().Object().Adr()).(scope.Array)
-			idx = arr.Get(idx)
-			rt2.ValueOf(parent)[e.Adr()] = idx
-			return OUT{do: next, next: NOW}
+			return expectExpr(in[0].frame, e.Left(), func(...IN) OUT {
+				arr := rt2.ValueOf(in[0].frame)[e.Left().Adr()].(scope.Array)
+				idx = arr.Get(idx)
+				rt2.ValueOf(parent)[e.Adr()] = idx
+				return OUT{do: next, next: NOW}
+			})
 		}
 		return OUT{do: wait, next: LATER}
 	case node.ProcedureNode:

+ 10 - 1
rt2/rules/return.go

@@ -43,9 +43,18 @@ func returnSeq(f frame.Frame) (frame.Sequence, frame.WAIT) {
 				return frame.End()
 			}
 			ret = frame.LATER
+		case node.IndexNode:
+			return This(expectExpr(f, a.Left(), func(...IN) OUT {
+				rt2.ValueOf(f.Parent())[a.Object().Adr()] = rt2.ValueOf(f)[a.Left().Adr()]
+				rt2.RegOf(f.Parent())["RETURN"] = rt2.ValueOf(f)[a.Left().Adr()]
+				if rt2.RegOf(f.Parent())["RETURN"] == nil {
+					rt2.RegOf(f.Parent())["RETURN"] = rt2.RegOf(f)["RETURN"]
+				}
+				return End()
+			}))
 		default:
 			fmt.Println(reflect.TypeOf(a.Left()))
-			panic("wrong right")
+			panic("wrong left")
 		}
 		return seq, ret
 	}

+ 1 - 1
rt2/rules/table.go

@@ -107,7 +107,7 @@ func prologue(n node.Node) frame.Sequence {
 			return left, frame.NOW
 		}
 	default:
-		panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
+		panic(fmt.Sprintln("unknown node", reflect.TypeOf(n), n.Adr()))
 	}
 }
 

+ 7 - 0
rt2/scope/modern/val.go

@@ -1537,6 +1537,13 @@ func (o *ops) Eq(a, b scope.Value) scope.Value {
 				default:
 					panic(fmt.Sprintln(reflect.TypeOf(y)))
 				}
+			case CHAR:
+				switch y := b.(type) {
+				case CHAR:
+					return BOOLEAN(x == y)
+				default:
+					panic(fmt.Sprintln(reflect.TypeOf(y)))
+				}
 			default:
 				panic(fmt.Sprintln(reflect.TypeOf(x)))
 			}