Skip to content

Instantly share code, notes, and snippets.

@VladD2
Created April 22, 2025 22:07
Show Gist options
  • Save VladD2/19283c6655e6842ed3e7a16465e35fed to your computer and use it in GitHub Desktop.
Save VladD2/19283c6655e6842ed3e7a16465e35fed to your computer and use it in GitHub Desktop.
Грамматика Mini C
_parser.Rules["Expr"] = new Rule[]
{
t.Number(),
t.Ident(),
new Seq([new Literal("("), new Ref("Expr"), new Literal(")")], "Parens"),
new Seq([t.Ident(), new Literal("("), new Literal(")")], "CallNoArgs"),
new Seq([t.Ident(), new Literal("("), new Ref("Expr"), new ZeroOrMany(new Seq([new Literal(","), new Ref("Expr")], Kind: "ArgsRest")), new Literal(")")], "Call"),
new Seq([new Literal("-"), new ReqRef("Expr", 300)], "Neg"),
new Seq([new Ref("Expr"), new Literal("*"), new ReqRef("Expr", 200)], "Mul"),
new Seq([new Ref("Expr"), new Literal("/"), new ReqRef("Expr", 200)], "Div"),
new Seq([new Ref("Expr"), new Literal("+"), new ReqRef("Expr", 100)], "Add"),
new Seq([new Ref("Expr"), new Literal("-"), new ReqRef("Expr", 100)], "Sub"),
new Seq([new Ref("Expr"), new Literal("=="), new ReqRef("Expr", 50)], "Eq"),
new Seq([new Ref("Expr"), new Literal("!="), new ReqRef("Expr", 50)], "Neq"),
new Seq([new Ref("Expr"), new Literal("<"), new ReqRef("Expr", 50)], "Lt"),
new Seq([new Ref("Expr"), new Literal(">"), new ReqRef("Expr", 50)], "Gt"),
new Seq([new Ref("Expr"), new Literal("<="), new ReqRef("Expr", 50)], "Le"),
new Seq([new Ref("Expr"), new Literal(">="), new ReqRef("Expr", 50)], "Ge"),
new Seq([new Ref("Expr"), new Literal("&&"), new ReqRef("Expr", 30)], "And"),
new Seq([new Ref("Expr"), new Literal("||"), new ReqRef("Expr", 20)], "Or"),
new Seq([new Ref("Expr"), new Literal("="), new ReqRef("Expr", 10, Right: true)], "AssignmentExpr"),
};
// Statement rules
_parser.Rules["Statement"] = new Rule[]
{
new Seq([new Literal("int"), t.Ident(), new Literal(";")], "VarDecl"),
new Seq([new Ref("Expr"), new Literal(";")], "ExprStmt"),
new Seq([new Literal("if"), new Literal("("), new Ref("Expr"), new Literal(")"),
new Ref("Block")], "IfStmt"),
new Seq([new Literal("if"), new Literal("("), new Ref("Expr"), new Literal(")"),
new Ref("Block"), new Literal("else"), new Ref("Block")], "IfElseStmt"),
new Seq([new Literal("return"), new Ref("Expr"), new Literal(";")], "Return")
};
// Block rules
_parser.Rules["Block"] =
[
new Seq([new Literal("{"), new ZeroOrMany(new Ref("Statement")), new Literal("}")], "MultiBlock"),
new Ref("Statement", "SimplBlock")
];
_parser.Rules["Params"] = [
new Choice([
new Seq([t.Ident(), new ZeroOrMany(new Seq([new Literal(","), t.Ident()], Kind: "ParamsRest"))], "ParamsList"),
new Literal("void", "VoidParams"),
], "Params")
];
// Function declaration
_parser.Rules["Function"] = [
new Seq([
new Literal("int"),
t.Ident(),
new Literal("("),
new Optional(new Ref("Params")), // Используем новый Optional
new Literal(")"),
new Ref("Block")
], "FunctionDecl")
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment