diff options
author | Robert Griesemer <gri@golang.org> | 2008-07-09 14:01:17 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2008-07-09 14:01:17 -0700 |
commit | 44810ab8e61f6e33b859d20bc0559c7ff207f46d (patch) | |
tree | c6884787880d8cb7ffabc012925f8f4ba8f5ae86 | |
parent | 99804c27efdde02b61df07192d0abba6f90127c8 (diff) | |
download | golang-44810ab8e61f6e33b859d20bc0559c7ff207f46d.tar.gz |
- completed parser - accepts full language (modulo bugs)
SVN=126551
-rw-r--r-- | usr/gri/src/parser.go | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/usr/gri/src/parser.go b/usr/gri/src/parser.go index 5238be5e4..355120d4d 100644 --- a/usr/gri/src/parser.go +++ b/usr/gri/src/parser.go @@ -692,6 +692,67 @@ func (P *Parser) ParseSwitchStat() { } +func (P *Parser) ParseCommCase() { + P.Trace("CommCase"); + if P.tok == Scanner.CASE { + P.Next(); + if P.tok == Scanner.GTR { + // send + P.Next(); + P.ParseExpression(); + P.Expect(Scanner.EQL); + P.ParseExpression(); + } else { + // receive + if P.tok != Scanner.LSS { + P.ParseIdent(); + P.Expect(Scanner.ASSIGN); + } + P.Expect(Scanner.LSS); + P.ParseExpression(); + } + } else { + P.Expect(Scanner.DEFAULT); + } + P.Expect(Scanner.COLON); + P.Ecart(); +} + + +func (P *Parser) ParseCommClause() { + P.Trace("CommClause"); + P.ParseCommCase(); + if P.tok != Scanner.CASE && P.tok != Scanner.DEFAULT && P.tok != Scanner.RBRACE { + P.ParseStatementList(); + P.Optional(Scanner.SEMICOLON); + } + P.Ecart(); +} + + +func (P *Parser) ParseRangeStat() bool { + P.Trace("RangeStat"); + P.Expect(Scanner.RANGE); + P.ParseIdentList(); + P.Expect(Scanner.DEFINE); + P.ParseExpression(); + P.ParseBlock(); + P.Ecart(); +} + + +func (P *Parser) ParseSelectStat() bool { + P.Trace("SelectStat"); + P.Expect(Scanner.SELECT); + P.Expect(Scanner.LBRACE); + for P.tok != Scanner.RBRACE { + P.ParseCommClause(); + } + P.Next(); + P.Ecart(); +} + + func (P *Parser) TryStatement() bool { P.Trace("Statement (try)"); switch P.tok { @@ -724,9 +785,9 @@ func (P *Parser) TryStatement() bool { case Scanner.SWITCH: P.ParseSwitchStat(); case Scanner.RANGE: - panic "range statement"; + P.ParseRangeStat(); case Scanner.SELECT: - panic "select statement"; + P.ParseSelectStat(); default: // no statement found P.Ecart(); |