1 Star 2 Fork 0

李登淳 / Demo 中文编程语言

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
cpl_grammar.csp 6.45 KB
一键复制 编辑 原始数据 按行查看 历史
李登淳 提交于 2023-04-03 10:26 . 修复路径问题
@charset: utf8
package cpl_grammar
import parsergen
import unicode
constant syntax = parsergen.syntax
var cvt = new unicode.codecvt.utf8
var grammar = new parsergen.grammar
grammar.ext = ".*\\.cpl"
@begin
grammar.lex = {
"endl" : unicode.build_wregex(cvt.local2wide("^\\n+$")),
"zh" : unicode.build_wregex(cvt.local2wide("^[\\u4E00-\\u9FA5\\u9FA6-\\u9FEF\\u3007][0-9\\u4E00-\\u9FA5\\u9FA6-\\u9FEF\\u3007]*$")),
"id" : unicode.build_wregex(cvt.local2wide("^[A-Za-z_]\\w*$")),
"num" : unicode.build_wregex(cvt.local2wide("^[0-9]+\\.?([0-9]+)?$")),
"str" : unicode.build_wregex(cvt.local2wide("^(\"|\"([^\"]|\\\\\")*\"?)$")),
"sig" : unicode.build_wregex(cvt.local2wide("^(\\+|-|\\*|/|<|<=|>|>=|=|==|!|!=?|(\\|)|(\\|\\|)|&|&&|\\.|;|,|\\(|\\)|\\[|\\]|\\{|\\})$")),
"ign" : unicode.build_wregex(cvt.local2wide("^([ \\f\\r\\t\\v]+|#.*)$")),
"err" : unicode.build_wregex(cvt.local2wide("^(\"|\\||&)$"))
}.to_hash_map()
@end
@begin
grammar.stx = {
"begin" : {
syntax.ref("stmts")
},
"ignore" : {
syntax.repeat(syntax.token("endl"))
},
"endline" : {syntax.cond_or(
{syntax.token("endl")},
{syntax.term(";")}
)},
"stmts" : {
syntax.repeat(syntax.ref("statement"), syntax.repeat(syntax.token("endl")))
},
"statement" : {syntax.cond_or(
{syntax.ref("import-stmt")},
{syntax.ref("decl-stmt")},
{syntax.ref("if-stmt")},
{syntax.ref("while-stmt")},
{syntax.ref("control-stmt")},
{syntax.ref("return-stmt")},
{syntax.ref("expr-stmt")}
)},
"identifier" : {
syntax.cond_or({syntax.token("zh")}, {syntax.token("id")})
},
"import-stmt" : {
syntax.term("引入"), syntax.ref("import-list"), syntax.ref("endline")
},
"module-list" : {
syntax.ref("identifier"), syntax.optional(syntax.term("."), syntax.cond_or({syntax.term("*")}, {syntax.ref("module-list")}))
},
"import-list" : {
syntax.ref("module-list"), syntax.optional(syntax.term("别名"), syntax.ref("identifier")), syntax.optional(syntax.term(","), syntax.ref("import-list"))
},
"block-body" : {
syntax.term("{"), syntax.ref("stmts"), syntax.term("}")
},
"argument-list" : {
syntax.ref("identifier"), syntax.repeat(syntax.term(","), syntax.ref("argument-list"))
},
"decl-stmt" : {
syntax.term("定义"), syntax.ref("decl-list"), syntax.ref("endline")
},
"decl-list" : {
syntax.ref("identifier"), syntax.cond_or(
{syntax.term("="), syntax.ref("single-expr")},
{syntax.term("("), syntax.optional(syntax.ref("argument-list")), syntax.term(")"), syntax.ref("block-body")}
), syntax.optional(syntax.term(","), syntax.ref("decl-list"))
},
"if-stmt" : {
syntax.term("如果"), syntax.term("("), syntax.ref("single-expr"), syntax.term(")"), syntax.ref("block-body"),
syntax.repeat(syntax.term("否则"), syntax.cond_or({syntax.ref("block-body")}, {syntax.ref("if-stmt")}))
},
"while-stmt" : {
syntax.term("循环"), syntax.term("("), syntax.ref("single-expr"), syntax.term(")"), syntax.ref("block-body")
},
"control-stmt" : {
syntax.cond_or({syntax.term("跳出")}, {syntax.term("继续")}), syntax.ref("endline")
},
"return-stmt" : {
syntax.term("返回"), syntax.optional(syntax.nlook(syntax.token("endl")), syntax.ref("expr")), syntax.ref("endline")
},
"expr-stmt" : {
syntax.ref("expr"), syntax.ref("endline")
},
"expr" : {
syntax.ref("single-expr"), syntax.optional(syntax.term(","), syntax.ref("expr"))
},
"single-expr" : {
syntax.ref("logic-or-expr"), syntax.optional(syntax.term("="), syntax.ref("single-expr"))
},
"logic-or-expr" : {
syntax.ref("logic-and-expr"), syntax.optional(syntax.cond_or({syntax.term("||")}, {syntax.term("或")}), syntax.ref("logic-or-expr"))
},
"logic-and-expr" : {
syntax.ref("equal-expr"), syntax.optional(syntax.cond_or({syntax.term("&&")}, {syntax.term("且")}), syntax.ref("logic-and-expr"))
},
"equal-expr" : {
syntax.ref("relat-expr"), syntax.optional(syntax.cond_or({syntax.term("==")}, {syntax.term("!=")}), syntax.ref("equal-expr"))
},
"relat-expr" : {
syntax.ref("add-expr"), syntax.optional(syntax.cond_or({syntax.term(">")}, {syntax.term("<")}, {syntax.term(">=")}, {syntax.term("<=")}), syntax.ref("relat-expr"))
},
"add-expr" : {
syntax.ref("mul-expr"), syntax.optional(syntax.cond_or({syntax.term("+")}, {syntax.term("-")}), syntax.ref("add-expr"))
},
"mul-expr" : {
syntax.ref("unary-expr"), syntax.optional(syntax.nlook(syntax.token("endl")), syntax.cond_or({syntax.term("*")}, {syntax.term("/")}), syntax.ref("mul-expr"))
},
"unary-expr" : {syntax.cond_or(
{syntax.ref("unary-op"), syntax.ref("unary-expr")},
{syntax.ref("prim-expr"), syntax.optional(syntax.nlook(syntax.token("endl")), syntax.ref("postfix-expr"))}
)},
"unary-op" : {syntax.cond_or(
{syntax.term("非")},
{syntax.term("++")},
{syntax.term("--")},
{syntax.term("-")},
{syntax.term("!")}
)},
"postfix-expr" : {
syntax.cond_or({syntax.term("++")}, {syntax.term("--")}), syntax.optional(syntax.ref("postfix-expr"))
},
"prim-expr" : {syntax.cond_or(
{syntax.ref("visit-expr")},
{syntax.ref("constant")}
)},
"visit-expr" : {
syntax.ref("object"), syntax.optional(syntax.term("."), syntax.ref("visit-expr"))
},
"object" : {syntax.cond_or(
{syntax.ref("array"), syntax.optional(syntax.ref("index"))},
{syntax.token("str"), syntax.optional(syntax.ref("index"))},
{syntax.ref("element")}
)},
"element" : {
syntax.cond_or({syntax.ref("identifier")}, {syntax.term("("), syntax.ref("single-expr"), syntax.term(")")}),
syntax.repeat(syntax.nlook(syntax.token("endl")), syntax.cond_or({syntax.ref("fcall")}, {syntax.ref("index")}))
},
"constant" : {syntax.cond_or(
{syntax.token("num")},
{syntax.term("空")},
{syntax.term("真")},
{syntax.term("假")}
)},
"array" : {
syntax.term("{"), syntax.optional(syntax.ref("expr")), syntax.term("}")
},
"fcall" : {
syntax.term("("), syntax.optional(syntax.ref("expr")), syntax.term(")")
},
"index" : {
syntax.term("["), syntax.optional(syntax.ref("add-expr")), syntax.term("]")
}
}.to_hash_map()
@end
1
https://gitee.com/mikecovlee/demo-cpl.git
git@gitee.com:mikecovlee/demo-cpl.git
mikecovlee
demo-cpl
Demo 中文编程语言
master

搜索帮助