Skip to content

Commit

Permalink
Added parsing of OPTION EXPLICIT and OPTION BASE.
Browse files Browse the repository at this point in the history
  • Loading branch information
icculus committed Dec 3, 2017
1 parent 3f89360 commit 5c3db13
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 4 deletions.
10 changes: 9 additions & 1 deletion mojobasic_compiler.cpp
Expand Up @@ -183,7 +183,15 @@ class AstPrinterVisitor : public AstVisitor
public:
AstPrinterVisitor() : indent(-1) { printf("PARSER: visiting AST for pretty-printing...\n"); }
~AstPrinterVisitor() { printf("PARSER: ...pretty-printing visit complete.\n"); }
virtual void visit(AstProgram *node) { node->block->accept(this); }
virtual void visit(AstProgram *node) {
if (node->bOptionExplicit) {
printf("OPTION EXPLICIT\n");
}
if (node->optionBase == 0) {
printf("OPTION BASE 0\n");
}
node->block->accept(this);
}

virtual void visit(AstProcedureDeclaration *node) {
printf("DECLARE ");
Expand Down
5 changes: 4 additions & 1 deletion mojobasic_internal.h
Expand Up @@ -512,7 +512,10 @@ enum Token
TOKEN_PUT,
TOKEN_STEP,
TOKEN_USING,
TOKEN_WEND
TOKEN_WEND,
TOKEN_OPTION,
TOKEN_EXPLICIT,
TOKEN_BASE
};


Expand Down
4 changes: 3 additions & 1 deletion mojobasic_internal_llvm.h
Expand Up @@ -510,10 +510,12 @@ struct AstOnErrorStatement : public AstStatement

struct AstProgram : public AstNode
{
AstProgram(const SourcePosition &pos, AstStatementBlock *_block) : AstNode(pos), block(_block) {}
AstProgram(const SourcePosition &pos, AstStatementBlock *_block, const bool _bOptionExplicit, const int _optionBase) : AstNode(pos), block(_block), bOptionExplicit(_bOptionExplicit), optionBase(_optionBase) {}
virtual ~AstProgram() { delete block; }
virtual void accept(AstVisitor *visitor) { visitor->visit(this); }
AstStatementBlock *block;
const bool bOptionExplicit;
const int optionBase;
};

void failCompile(void *c, const char *err, const SourcePosition &pos);
Expand Down
43 changes: 42 additions & 1 deletion mojobasic_parser.cpp
Expand Up @@ -57,6 +57,8 @@ class Parser
, strcache(_strcache)
, bPushedBack(false)
, bWasNumericLabel(false)
, optionExplicit(-1)
, optionBase(-1)
{}

~Parser() { assert(pp == NULL); }
Expand Down Expand Up @@ -98,6 +100,7 @@ class Parser
AstDefStatement *parseDefStr() { return parseDefType("STR"); }
AstStatement *parseOnError(const bool bLocal);
AstStatement *parseOn();
void parseOption();
AstSubCallStatement *parseOpen();
AstSubCallStatement *parseClose();
AstSubCallStatement *parsePrint();
Expand Down Expand Up @@ -127,6 +130,8 @@ class Parser
TokenData pushbackToken;
bool bPushedBack;
bool bWasNumericLabel;
int optionExplicit;
int optionBase;
};

AstProgram *parseSource(void *ctx, StringCache &strcache, const char *filename, const char *source, unsigned int sourcelen, MOJOBASIC_includeOpen include_open, MOJOBASIC_includeClose include_close)
Expand Down Expand Up @@ -288,6 +293,9 @@ void Parser::convertToParserToken(TokenData &data)
TOKENCMP(STEP);
TOKENCMP(USING);
TOKENCMP(WEND);
TOKENCMP(OPTION);
TOKENCMP(EXPLICIT);
TOKENCMP(BASE);
#undef TOKENCMP
} // if
} // Parser::convertToParserToken
Expand All @@ -313,7 +321,10 @@ AstProgram *Parser::run(const char *filename, const char *source, unsigned int s
preprocessor_end(pp);
pp = NULL;

return new AstProgram(startpos, collector.newStatementBlock());
if (optionExplicit == -1) optionExplicit = 0;
if (optionBase == -1) optionBase = 1;

return new AstProgram(startpos, collector.newStatementBlock(), optionExplicit != 0, optionBase);
} // Parser::run

void Parser::pushback()
Expand Down Expand Up @@ -433,6 +444,9 @@ AstStatement *Parser::parseStatement() {

while (want(TOKEN_NEWLINE)) { /* spin */ } // skip blank lines.

// OPTION doesn't return a statement, so just eat these without returning.
while (want(TOKEN_OPTION)) { parseOption(); needEndOfStatement(); }

if (want(TOKEN_EOI)) return NULL; // we're done.
else if (want(TOKEN_METACOMMAND)) return parseMetacommand();
else if (want(TOKEN_DECLARE)) return parseDeclare();
Expand Down Expand Up @@ -804,6 +818,33 @@ AstStatement *Parser::parseOn() {
return failAndDumpStatement("Syntax error"); // !!! FIXME: "expected ERROR,etc"?
} // Parser::parseOn

void Parser::parseOption() {
const char *dupeerr = "Duplicate OPTION statement";

if (want(TOKEN_EXPLICIT)) {
if (optionExplicit != -1) {
fail(dupeerr);
} else {
optionExplicit = 1;
}
} else if (want(TOKEN_BASE)) {
const char *oneOrZeroErr = "Expected 0 or 1";
if (need(TOKEN_INT_LITERAL, oneOrZeroErr)) {
if ((previousToken.i64 != 0) && (previousToken.i64 != 1)) {
fail(oneOrZeroErr);
} else {
if (optionBase != -1) {
fail(dupeerr);
} else {
optionBase = (int) previousToken.i64;
}
}
}
} else {
fail("Expected BASE or EXPLICIT");
}
} // Parser::parseOption

AstForStatement *Parser::parseFor()
{
const SourcePosition position(previousToken.position);
Expand Down
3 changes: 3 additions & 0 deletions mojobasic_preprocessor.cpp
Expand Up @@ -237,6 +237,9 @@ static void MOJOBASIC_print_debug_token(const char *subsystem, const char *token
TOKENCASE(TOKEN_STEP);
TOKENCASE(TOKEN_USING);
TOKENCASE(TOKEN_WEND);
TOKENCASE(TOKEN_OPTION);
TOKENCASE(TOKEN_EXPLICIT);
TOKENCASE(TOKEN_BASE);
#undef TOKENCASE

default:
Expand Down

0 comments on commit 5c3db13

Please sign in to comment.