src/Parser.cpp
changeset 170 5e4570966ece
parent 167 cf82769eb136
child 172 48cffae8c9e0
     1.1 --- a/src/Parser.cpp	Mon Aug 06 02:03:36 2012 -0700
     1.2 +++ b/src/Parser.cpp	Sat Aug 11 12:11:39 2012 -0700
     1.3 @@ -641,7 +641,7 @@
     1.4          if (match(TOK_NEW)) {
     1.5              if (!enterScope(Scope::BLOCK))
     1.6                  return NULL;
     1.7 -            if ((decl = vars(TOK_NEW)) == NULL)
     1.8 +            if ((decl = vars(TOK_STOCK, TOK_NEW)) == NULL)
     1.9                  return NULL;
    1.10          } else {
    1.11              if ((decl = expressionStatement()) == NULL)
    1.12 @@ -709,7 +709,7 @@
    1.13  }
    1.14  
    1.15  VariableDeclaration *
    1.16 -Parser::var(TokenKind kind)
    1.17 +Parser::var(TokenKind scope, TokenKind kind)
    1.18  {
    1.19      Local<String> tag(zone_);
    1.20      if (matchName(tag.ref(), TOK_LABEL) && !tag)
    1.21 @@ -732,6 +732,9 @@
    1.22      if (!var)
    1.23          return NULL;
    1.24  
    1.25 +    if (scope == TOK_PUBLIC)
    1.26 +        var->setPublic();
    1.27 +
    1.28      ExpressionList *postDimensions = NULL;
    1.29      if (peek(TOK_LBRACKET)) {
    1.30          if ((postDimensions = dimensions()) == NULL)
    1.31 @@ -748,9 +751,9 @@
    1.32  }
    1.33  
    1.34  Statement *
    1.35 -Parser::vars(TokenKind kind)
    1.36 +Parser::vars(TokenKind scope, TokenKind kind)
    1.37  {
    1.38 -    VariableDeclaration *decl = var(kind);
    1.39 +    VariableDeclaration *decl = var(scope, kind);
    1.40      if (!decl)
    1.41          return NULL;
    1.42  
    1.43 @@ -762,7 +765,7 @@
    1.44          return NULL;
    1.45  
    1.46      while (match(TOK_COMMA)) {
    1.47 -        Statement *decl = var(kind);
    1.48 +        Statement *decl = var(scope, kind);
    1.49          if (!decl)
    1.50              return NULL;
    1.51          if (!statements->append(decl))
    1.52 @@ -899,7 +902,7 @@
    1.53        case TOK_CONST:
    1.54        case TOK_NEW:
    1.55          scanner_.scan();
    1.56 -        if ((statement = vars(kind)) == NULL)
    1.57 +        if ((statement = vars(TOK_STOCK, kind)) == NULL)
    1.58              return NULL;
    1.59          break;
    1.60  
    1.61 @@ -1296,10 +1299,17 @@
    1.62            case TOK_LABEL:
    1.63            {
    1.64              scanner_.scan();
    1.65 -            if ((statement = function(kind)) == NULL)
    1.66 -                return NULL;
    1.67 -            if ((kind == TOK_FORWARD || kind == TOK_NATIVE) && !matchSemicolon())
    1.68 -                return NULL;
    1.69 +            if (kind == TOK_PUBLIC && peek(TOK_CONST)) {
    1.70 +                if ((statement = var(TOK_PUBLIC, scanner_.scan())) == NULL)
    1.71 +                    return NULL;
    1.72 +                if (!matchSemicolon())
    1.73 +                    return NULL;
    1.74 +            } else {
    1.75 +                if ((statement = function(kind)) == NULL)
    1.76 +                    return NULL;
    1.77 +                if ((kind == TOK_FORWARD || kind == TOK_NATIVE) && !matchSemicolon())
    1.78 +                    return NULL;
    1.79 +            }
    1.80              break;
    1.81            }
    1.82  
    1.83 @@ -1310,8 +1320,8 @@
    1.84              // declarations yet, to see if we can get away with forcing
    1.85              // a nicer top-level style.
    1.86              scanner_.scan();
    1.87 -            if ((statement = var(kind)) == NULL)
    1.88 -               return NULL;
    1.89 +            if ((statement = var(TOK_STOCK, kind)) == NULL)
    1.90 +                return NULL;
    1.91              if (!matchSemicolon())
    1.92                  return NULL;
    1.93              break;