URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [go.test/] [test/] [ken/] [rob2.go] - Rev 700
Compare with Previous | Blame | View Log
// $G $D/$F.go && $L $F.$A && ./$A.out// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package mainimport "fmt"const nilchar = 0type Atom struct {str stringinteger intnext *Slist /* in hash bucket */}type List struct {car *Slistcdr *Slist}type Slist struct {isatom boolisstring bool//union {atom Atomlist List//} u;}func (this *Slist) Car() *Slist {return this.list.car}func (this *Slist) Cdr() *Slist {return this.list.cdr}func (this *Slist) String() string {return this.atom.str}func (this *Slist) Integer() int {return this.atom.integer}func (slist *Slist) Free() {if slist == nil {return}if slist.isatom {// free(slist.String());} else {slist.Car().Free()slist.Cdr().Free()}// free(slist);}//Slist* atom(byte *s, int i);var token intvar peekc int = -1var lineno int32 = 1var input stringvar inputindex int = 0var tokenbuf [100]bytevar tokenlen int = 0const EOF int = -1func main() {var list *SlistOpenFile()for {list = Parse()if list == nil {break}r := list.Print()list.Free()if r != "(defn foo (add 12 34))" {panic(r)}break}}func (slist *Slist) PrintOne(doparen bool) string {if slist == nil {return ""}var r stringif slist.isatom {if slist.isstring {r = slist.String()} else {r = fmt.Sprintf("%v", slist.Integer())}} else {if doparen {r += "("}r += slist.Car().PrintOne(true)if slist.Cdr() != nil {r += " "r += slist.Cdr().PrintOne(false)}if doparen {r += ")"}}return r}func (slist *Slist) Print() string {return slist.PrintOne(true)}func Get() int {var c intif peekc >= 0 {c = peekcpeekc = -1} else {c = int(input[inputindex])inputindex++if c == '\n' {lineno = lineno + 1}if c == nilchar {inputindex = inputindex - 1c = EOF}}return c}func WhiteSpace(c int) bool {return c == ' ' || c == '\t' || c == '\r' || c == '\n'}func NextToken() {var i, c inttokenbuf[0] = nilchar // clear previous tokenc = Get()for WhiteSpace(c) {c = Get()}switch c {case EOF:token = EOFcase '(', ')':token = cbreakdefault:for i = 0; i < 100-1; { // sizeof tokenbuf - 1tokenbuf[i] = byte(c)i = i + 1c = Get()if c == EOF {break}if WhiteSpace(c) || c == ')' {peekc = cbreak}}if i >= 100-1 { // sizeof tokenbuf - 1panic("atom too long\n")}tokenlen = itokenbuf[i] = nilcharif '0' <= tokenbuf[0] && tokenbuf[0] <= '9' {token = '0'} else {token = 'A'}}}func Expect(c int) {if token != c {print("parse error: expected ", c, "\n")panic("parse")}NextToken()}// Parse a non-parenthesized list up to a closing paren or EOFfunc ParseList() *Slist {var slist, retval *Slistslist = new(Slist)slist.list.car = nilslist.list.cdr = nilslist.isatom = falseslist.isstring = falseretval = slistfor {slist.list.car = Parse()if token == ')' || token == EOF { // empty cdrbreak}slist.list.cdr = new(Slist)slist = slist.list.cdr}return retval}func atom(i int) *Slist { // BUG: uses tokenbuf; should take argument)var slist *Slistslist = new(Slist)if token == '0' {slist.atom.integer = islist.isstring = false} else {slist.atom.str = string(tokenbuf[0:tokenlen])slist.isstring = true}slist.isatom = truereturn slist}func atoi() int { // BUG: uses tokenbuf; should take argument)var v int = 0for i := 0; i < tokenlen && '0' <= tokenbuf[i] && tokenbuf[i] <= '9'; i = i + 1 {v = 10*v + int(tokenbuf[i]-'0')}return v}func Parse() *Slist {var slist *Slistif token == EOF || token == ')' {return nil}if token == '(' {NextToken()slist = ParseList()Expect(')')return slist} else {// Atomswitch token {case EOF:return nilcase '0':slist = atom(atoi())case '"', 'A':slist = atom(0)default:slist = nilprint("unknown token: ", token, "\n")}NextToken()return slist}return nil}func OpenFile() {input = "(defn foo (add 12 34))\n\x00"inputindex = 0peekc = -1 // BUGNextToken()}
