Created
April 22, 2025 22:07
-
-
Save VladD2/19283c6655e6842ed3e7a16465e35fed to your computer and use it in GitHub Desktop.
Грамматика Mini C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
_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