Skip to content

Commit

Permalink
Implemented GET and PUT parsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Nov 17, 2017
1 parent 0f54b8e commit eac13d7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 3 deletions.
5 changes: 4 additions & 1 deletion mojobasic_internal.h
Expand Up @@ -507,7 +507,10 @@ enum Token
TOKEN_WRITE,
TOKEN_LOCK,
TOKEN_ACCESS,
TOKEN_DEF
TOKEN_DEF,
TOKEN_GET,
TOKEN_PUT,
TOKEN_STEP
};


Expand Down
47 changes: 45 additions & 2 deletions mojobasic_parser.cpp
Expand Up @@ -104,6 +104,7 @@ class Parser
AstSubCallStatement *parseView();
AstSubCallStatement *parseInput();
AstSubCallStatement *parseLine();
AstSubCallStatement *parseGetOrPut(const bool bIsGet);
AstIfStatement *parseIf();
AstStatement *parseDo();
AstStatement *parseEnd();
Expand Down Expand Up @@ -264,6 +265,9 @@ void Parser::convertToParserToken(TokenData &data)
TOKENCMP(LOCK);
TOKENCMP(ACCESS);
TOKENCMP(DEF);
TOKENCMP(GET);
TOKENCMP(PUT);
TOKENCMP(STEP);
#undef TOKENCMP
} // if
} // Parser::convertToParserToken
Expand Down Expand Up @@ -431,8 +435,8 @@ AstStatement *Parser::parseStatement() {
else if (want(TOKEN_PRINT) || want(TOKEN_QUESTION)) return parsePrint();
else if (want(TOKEN_OPEN)) return parseOpen();
else if (want(TOKEN_CLOSE)) return parseClose();
//else if (want(TOKEN_GET)) return parseGet();
//else if (want(TOKEN_PUT)) return parsePut();
else if (want(TOKEN_GET)) return parseGetOrPut(true);
else if (want(TOKEN_PUT)) return parseGetOrPut(false);
//else if (want(TOKEN_LINE)) return parseLine();
else if (want(TOKEN_VIEW)) return parseView();
else if (want(TOKEN_LINE)) return parseLine();
Expand Down Expand Up @@ -1050,6 +1054,45 @@ AstSubCallStatement *Parser::parseClose()
return new AstSubCallStatement(position, "CLOSE", args);
} // Parser::parseClose

AstSubCallStatement *Parser::parseGetOrPut(const bool bIsGet)
{
const SourcePosition position(previousToken.position);

want(TOKEN_HASH); // optional

int numargs = 1;
AstExpression *filenum = parseExpression();
AstExpression *recnum = NULL;
AstExpression *lvalue = NULL;

if (!filenum) {
fail("Expected file number expression");
filenum = new AstIntLiteralExpression(position, 1);
}

if (want(TOKEN_COMMA))
{
numargs++;
recnum = parseExpression();
if (!recnum) {
fail("Expected expression");
}

if (want(TOKEN_COMMA)) {
numargs++;
// !!! FIXME: we should have a parseLValue for this?
const char *ident = need(TOKEN_IDENTIFIER, "Expected variable") ? previousToken.string : "x";
lvalue = parseIdentifierExpression(new AstIdentifierExpression(previousToken.position, ident));
}
}

AstExpressionList *args = new AstExpressionList(position, new AstIntLiteralExpression(position, numargs));
if (filenum) args->append(filenum);
if (recnum) args->append(recnum);
if (lvalue) args->append(lvalue);
return new AstSubCallStatement(position, bIsGet ? "GET" : "PUT", args);
} // Parser::parseGetOrPut

AstSubCallStatement *Parser::parsePrint()
{
const SourcePosition position(previousToken.position);
Expand Down
3 changes: 3 additions & 0 deletions mojobasic_preprocessor.cpp
Expand Up @@ -232,6 +232,9 @@ static void MOJOBASIC_print_debug_token(const char *subsystem, const char *token
TOKENCASE(TOKEN_LOCK);
TOKENCASE(TOKEN_ACCESS);
TOKENCASE(TOKEN_DEF);
TOKENCASE(TOKEN_GET);
TOKENCASE(TOKEN_PUT);
TOKENCASE(TOKEN_STEP);
#undef TOKENCASE

default:
Expand Down

0 comments on commit eac13d7

Please sign in to comment.