// Factor_Tail-> "*" power Factor_Tail | "/"" power Factor_Tail | Epsolon void Parser::Factor_Tail() { switch (scanner.nextToken()) { case T_MULTIPLY: // * { scanner.eatToken(T_MULTIPLY); Power(); if (scanner.nextToken() == T_MULTIPLY || scanner.nextToken() == T_DIVIDE) Factor_Tail(); break; } case T_DIVIDE: // / { scanner.eatToken(T_DIVIDE); Power(); if (scanner.nextToken() == T_MULTIPLY || scanner.nextToken() == T_DIVIDE) Factor_Tail(); break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }
//Exp_Tail -> "+" Factor Exp_Tail | "-" Factor Exp_Tail | EPSOLON void Parser::Exp_Tail() { switch (scanner.nextToken()) { case T_PLUS: // + { scanner.eatToken(T_PLUS); Factor(); if (scanner.nextToken() == T_PLUS || scanner.nextToken() == T_MINUS) Exp_Tail(); break; } case T_MINUS: // - { scanner.eatToken(T_MINUS); Factor(); if (scanner.nextToken() == T_PLUS || scanner.nextToken() == T_MINUS) Exp_Tail(); break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }
Inst parseMnemoGcnAddr(unsigned opCode, Scanner& scanner, Brigantine& bw, int* vx) { unsigned const type = scanner.eatToken(EMType); scanner.eatToken(EMNone); InstAddr res = bw.addInst<InstAddr>(opCode); res.segment() = BRIG_SEGMENT_AMD_GCN; res.type() = type; return res; }
void Parser::match(token current_token) { if(current_token == lookahead) { scanner.eatToken(current_token); lookahead = scanner.nextToken(); } else { mismatchError(scanner.lineNumber(),current_token , lookahead); } }
Inst parseMnemoGcnAtomic(unsigned opCode, Scanner& scanner, Brigantine& bw, int*) { unsigned const atomicOperation = scanner.eatToken(EMAtomicOp); OptionalU const segment = scanner.tryEatToken(EMSegment); unsigned const memoryOrder = scanner.eatToken(EMMemoryOrder); unsigned const memoryScope = scanner.eatToken(EMMemoryScope); OptionalU const equivClass = tryParseEquiv(scanner); unsigned const type = scanner.eatToken(EMType); scanner.eatToken(EMNone); InstAtomic res = bw.addInst<InstAtomic>(opCode,type); res.atomicOperation() = atomicOperation; res.segment() = BrigSegment(segment.isInitialized() ? segment.value() : BRIG_SEGMENT_AMD_GCN); res.equivClass() = equivClass.isInitialized() ? equivClass.value() : 0; res.memoryOrder() = memoryOrder; res.memoryScope() = memoryScope; return res; }
// final -> Num | "(" Expression ")" | m [ Expression ] void Parser:: Final() { switch (scanner.nextToken()) { case T_OPENPAREN: // ( { scanner.eatToken(T_OPENPAREN); switch(scanner.nextToken()) { case T_M: case T_NUMBER: case T_OPENPAREN: Expression(); case T_EOF: break; } scanner.eatToken(T_CLOSEPAREN); break; } case T_M: // m { scanner.eatToken(T_M); scanner.eatToken(T_OPENBRACKET); switch(scanner.nextToken()) { case T_M: case T_NUMBER: case T_OPENPAREN: Expression(); case T_EOF: break; } scanner.eatToken(T_CLOSEBRACKET); break; } case T_NUMBER: // num { scanner.eatToken(T_NUMBER); num_parser = scanner.getNumberValue(); break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }
int main(int argc, char* argv[]) { if (argc == 2 && (strcmp(argv[1], "-s") == 0)) { Scanner scanner; while (scanner.nextToken() != T_EOF) { std::cout << tokenToString(scanner.nextToken()) << " "; scanner.eatToken(scanner.nextToken()); } std::cout<<std::endl; } else if (argc == 2 && (strcmp(argv[1], "-e") == 0)) { Parser parser(true); parser.parse(); } else { Parser parser(false); parser.parse(); } return 0; }
// power_Tail -> "**" final power_Tail | Epsilon void Parser::Power_Tail() { switch (scanner.nextToken()) { case T_POWER: // ** { scanner.eatToken(T_POWER); Final(); if (scanner.nextToken() == T_POWER) Power_Tail(); break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }
// Term -> ; Statement Term | Epsolon void Parser::Term() { //cout<< tokenToString(scanner.nextToken()) <<endl; switch (scanner.nextToken()) { case T_SEMICOLON: //; { scanner.eatToken(T_SEMICOLON); Statement(); if (scanner.nextToken() == T_SEMICOLON) Term(); //Term(); break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }
// Statement -> "m" "[" Expression "]" "=" Expression | print Expression void Parser::Statement() { switch(scanner.nextToken()) { case T_M: { scanner.eatToken(T_M); scanner.eatToken(T_OPENBRACKET); switch(scanner.nextToken()) { case T_M: case T_NUMBER: case T_OPENPAREN: Expression(); case T_EOF: break; } scanner.eatToken(T_CLOSEBRACKET); scanner.eatToken(T_EQUALS); switch(scanner.nextToken()) { case T_M: case T_NUMBER: case T_OPENPAREN: Expression(); case T_EOF: break; } break; } case T_PRINT: { scanner.eatToken(T_PRINT); switch(scanner.nextToken()) { case T_M: case T_NUMBER: case T_OPENPAREN: Expression(); case T_EOF: break; } break; } case T_EOF: break; default: { parseError(scanner.lineNumber(), scanner.nextToken()); break; } } }