package jp.ac.aiit.jointry.services.lang.parser;
import static jp.ac.aiit.jointry.services.lang.parser.Parser.*;
import java.util.HashSet;
import jp.ac.aiit.jointry.services.lang.ast.*;
public class JointryParser {
HashSet<String> reserved = new HashSet<String>();
Operators operators = new Operators();
/*
* 基本的な文法定義
* primary : ( "[" [ elements ] "]" | "(" expr ")"
* | NUMBER | IDENTIFIER | STRING ) { postfix }
* factor : "-" primary | primary
* expr : factor { OP factor }
* block : "{" [ statement ] { ( ";" | EOF ) [ statement ] } "}"
* simple : expr [ args ]
* statement : "if" expr block [ "else" block ]
* | "while" expr block
* | "rotate" expr
* | "move" expr
* | "costume" expr
* | simple
* program : [ defclass | def | statemnet ] ( ";" | EOL )
*/
Parser expr0 = rule();
Parser primary = rule(PrimaryExpr.class)
.or(rule().sep("(").ast(expr0).sep(")"),
rule().number(NumberLiteral.class),
rule().identifier(Name.class, reserved),
rule().string(StringLiteral.class));
Parser factor = rule().or(rule(NegativeExpr.class).sep("-").ast(primary),
rule(ReboundStmnt.class).sep("rebound"),
primary);
Parser expr = expr0.expression(BinaryExpr.class, factor, operators);
Parser statement0 = rule();
Parser block = rule(BlockStmnt.class)
.sep("{").option(statement0)
.repeat(rule().sep(";", Token.EOL).option(statement0))
.sep("}");
Parser simple = rule(PrimaryExpr.class).ast(expr);
Parser statement
= statement0.or(
rule(IfStmnt.class).sep("if").ast(expr).ast(block)
.option(rule().sep("else").ast(block)),
rule(WhileStmnt.class).sep("while").ast(expr).ast(block),
rule(BreakStmnt.class).sep("break"),
rule(FlipStmnt.class).sep("flip"),
rule(ContinueStmnt.class).sep("continue"),
rule(SleepStmnt.class).sep("sleep").ast(expr),
rule(RotateStmnt.class).sep("rotate").ast(expr),
rule(MoveStmnt.class).sep("move").ast(expr),
rule(CostumeStmnt.class).sep("costume").ast(expr),
rule(ReboundStmnt.class).sep("rebound").ast(expr),
rule(SpeechStmnt.class).sep("speech").ast(expr),
simple);
Parser program
= rule().or(statement, rule(NullStmnt.class)).sep(";", Token.EOL);
/*
* 関数に関係する文法規則
* param : IDENTIFIER
* params : param { "," param }
* paramlist : "(" [ params ] ")"
* def : "def" IDENTIFIER paramlist block
* args : expr { "," expr }
* postfix : "." IDENTIFIER | "(" [ args ] ")" | "[" expr "]"
*/
//Parser param = rule().identifier(reserved);
//Parser params = rule(ParameterList.class)
// .ast(param).repeat(rule().sep(",").ast(param));
//Parser paramList = rule().sep("(").maybe(params).sep(")");
//Parser def = rule(DefStmnt.class)
// .sep("def").identifier(reserved).ast(paramList).ast(block);
//Parser args = rule(Arguments.class)
// .ast(expr).repeat(rule().sep(",").ast(expr));
//Parser postfix = rule().sep("(").maybe(args).sep(")");
/*
* クラスに関係する文法規則
* member : def | simple
* classbody : "{" [ member ] { ( "; " | EOL ) [ member ] } "}"
* defclass : "class" IDENTIFIER [ "extends" IDENTIFIER ] classbody
*/
//Parser member = rule().or(def, simple);
//Parser classBody = rule(ClassBody.class).sep("{").option(member)
// .repeat(rule().sep(";", Token.EOL).option(member))
// .sep("}");
//Parser defclass = rule(ClassStmnt.class).sep("class").identifier(reserved)
// .option(rule().sep("extends").identifier(reserved))
// .ast(classBody);
/*
* 配列に関係する文法規則
* elements : expr { !,! expr }
*/
//Parser elements =
// rule(ArrayLiteral.class).ast(expr).repeat(rule().sep(",").ast(expr));
/*======================================================================*/
public JointryParser() {
//primary.repeat(postfix);
//simple.option(args);
//program.insertChoice(def);
reserved.add(";");
reserved.add("}");
reserved.add(")");
reserved.add(Token.EOL);
operators.add("=", 1, Operators.RIGHT);
operators.add("==", 2, Operators.LEFT);
operators.add("!=", 2, Operators.LEFT);
operators.add(">", 2, Operators.LEFT);
operators.add(">=", 2, Operators.LEFT);
operators.add("<", 2, Operators.LEFT);
operators.add("<=", 2, Operators.LEFT);
operators.add("+", 3, Operators.LEFT);
operators.add("-", 3, Operators.LEFT);
operators.add("*", 4, Operators.LEFT);
operators.add("/", 4, Operators.LEFT);
operators.add("%", 4, Operators.LEFT);
//primary.insertChoice(rule(Fun.class)
// .sep("fun").ast(paramList).ast(block));
//postfix.insertChoice(rule(Dot.class).sep(".").identifier(reserved));
//program.insertChoice(defclass);
//reserved.add("]");
//primary.insertChoice(rule().sep("[").maybe(elements).sep("]"));
//postfix.insertChoice(rule(ArrayRef.class).sep("[").ast(expr).sep("]"));
}
public ASTree parse(Lexer lexer) throws ParseException {
return program.parse(lexer);
}
}