summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2008-07-09 14:01:17 -0700
committerRobert Griesemer <gri@golang.org>2008-07-09 14:01:17 -0700
commit44810ab8e61f6e33b859d20bc0559c7ff207f46d (patch)
treec6884787880d8cb7ffabc012925f8f4ba8f5ae86
parent99804c27efdde02b61df07192d0abba6f90127c8 (diff)
downloadgolang-44810ab8e61f6e33b859d20bc0559c7ff207f46d.tar.gz
- completed parser - accepts full language (modulo bugs)
SVN=126551
-rw-r--r--usr/gri/src/parser.go65
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();