examples/robots_grammar.cr @ trunk
../src/gpcr/regex_subset
scale = 0.75 fontscale = 1.500 box wid 2.894 ht 0.340 with .nw at (0.035, -0.035) fill 0xCBD5E1 color 0xCBD5E1 box wid 2.894 ht 0.340 with .nw at (0.000, 0.000) fill 0x7C83E6 color 0x7C83E6 box wid 0.300 ht 0.065 rad 0.018 at (0.370, -0.022) fill 0xffffff color 0xffffff line from (0.140, 0.000) to (0.140, -0.340) color white line from (2.754, 0.000) to (2.754, -0.340) color white text "require '../src/gpcr/regex_subset'" color white at (1.447, -0.170)→ /pikchrshow
crystal source
require "../src/gpcr/regex_subset"
json block
{
"kind": "require",
"name": "../src/gpcr/regex_subset",
"doc": null,
"children": []
}
include GPCR::RegexSubset
private def lit(s : String) : Pattern
Lit.new(s).as(Pattern)
end
private def seq(*parts : Pattern) : Pattern
Seq.new(parts.to_a).as(Pattern)
end
private def grp(p : Pattern) : Pattern
Group.new(p).as(Pattern)
end
private def rep(p : Pattern, min : Int32, max : Int32? = nil) : Pattern
Repeat.new(p, min, max).as(Pattern)
end
private def cc(chars : String) : Pattern
CharClass.new(chars).as(Pattern)
end
private def vv : Pattern
V.as(Pattern)
end
private def ahead_pos(chars : String) : Pattern
Guard.new(:ahead, chars, negate: false).as(Pattern)
end
MULOPS = "⊗/⊘%"
ADDOPS = "⊕⊖"
CMPOPS = "≺≻≼≽"
EQOPS = "≟≠"
ANDOPS = "∧"
OROPS = "∨⊻"
ROBOTS_GRAMMAR = [
Rule.new("main_head", lit("🏁⟮🐍⟯🔖⏎"), "MainHead"),
Rule.new("def_head", seq(lit("🔕𝑥"), rep(grp(seq(lit("⟮"), rep(grp(seq(lit("𝑥"), rep(grp(lit(",𝑥")), 0))), 0, 1), lit("⟯"))), 0, 1), lit("⏎")), "DefHead"),
Rule.new("global", seq(lit("🌐⟮𝑥,"), vv, lit("⟯⏎")), "Statement"),
Rule.new("literal", cc("🔢🔚"), "Expression"),
Rule.new("call0", lit("∉"), "Expression"),
Rule.new("call", seq(lit("𝑥⟮"), rep(grp(seq(vv, rep(grp(seq(lit(","), vv)), 0))), 0, 1), lit("⟯")), "Expression"),
Rule.new("call1", seq(lit("∊⟮"), vv, lit("⟯")), "Expression"),
Rule.new("call2", seq(lit("∋⟮"), vv, lit(","), vv, lit("⟯")), "Expression"),
Rule.new("paren", seq(lit("⟮"), vv, lit("⟯")), "Expression"),
Rule.new("neg", seq(Guard.new(:behind, "№🐍😑𝑥⟯").as(Pattern), lit("⊖"), vv), "Expression"),
Rule.new("mul", GPCR::RegexSubset.infix_pattern(MULOPS, ""), "Expression"),
Rule.new("add", GPCR::RegexSubset.infix_pattern(ADDOPS, MULOPS), "Expression"),
Rule.new("cmp", GPCR::RegexSubset.infix_pattern(CMPOPS, MULOPS + ADDOPS), "Expression"),
Rule.new("eq", GPCR::RegexSubset.infix_pattern(EQOPS, MULOPS + ADDOPS + CMPOPS), "Expression"),
Rule.new("and", GPCR::RegexSubset.infix_pattern(ANDOPS, MULOPS + ADDOPS + CMPOPS + EQOPS), "Expression"),
Rule.new("or", GPCR::RegexSubset.infix_pattern(OROPS, MULOPS + ADDOPS + CMPOPS + EQOPS + ANDOPS), "Expression"),
Rule.new("command1", seq(lit("∊"), vv, ahead_pos("⏎⟯,")), "Expression"),
Rule.new("command2", seq(lit("∋"), vv, lit(","), vv, ahead_pos("⏎⟯,")), "Expression"),
Rule.new("assign", seq(lit("𝑥="), vv, ahead_pos("⏎⟯,")), "Expression"),
Rule.new("opassign", seq(lit("𝑥"), cc("➕➖✖⁒"), vv, ahead_pos("⏎⟯,")), "Expression"),
Rule.new("if_head", seq(lit("🔜"), vv, lit("⏎")), "IfHead"),
Rule.new("elsif_head", seq(lit("🔘"), vv, lit("⏎")), "ElsifHead"),
Rule.new("while_head", seq(lit("🔣"), vv, lit("⏎")), "WhileHead"),
Rule.new("until_head", seq(lit("🔂"), vv, lit("⏎")), "UntilHead"),
Rule.new("case_head", seq(lit("🔔"), vv, lit("⏎")), "CaseHead"),
Rule.new("when_head", seq(lit("🔶"), vv, lit("⏎")), "WhenHead"),
Rule.new("return", seq(lit("↩"), rep(vv, 0, 1), lit("⏎")), "Statement"),
Rule.new("break", lit("🔓⏎"), "Statement"),
Rule.new("exprstmt", seq(vv, lit("⏎")), "Statement"),
Rule.new("if", seq(lit("🅸"), rep(lit("❢"), 0), rep(grp(seq(lit("🅴"), rep(lit("❢"), 0))), 0), rep(grp(seq(lit("🔗⏎"), rep(lit("❢"), 0))), 0, 1), lit("🔙⏎")), "Statement"),
Rule.new("while", seq(lit("🆆"), rep(lit("❢"), 0), lit("🔙⏎")), "Statement"),
Rule.new("until", seq(lit("🆄"), rep(lit("❢"), 0), lit("🔙⏎")), "Statement"),
Rule.new("case", seq(lit("🅲"), rep(grp(seq(lit("🆂"), rep(lit("❢"), 0))), 1), rep(grp(seq(lit("🔗⏎"), rep(lit("❢"), 0))), 0, 1), lit("🔙⏎")), "Statement"),
Rule.new("def", seq(lit("🅳"), rep(lit("❢"), 0), lit("🔙⏎")), "Statement"),
Rule.new("main", seq(lit("🅼"), rep(lit("❢"), 0), lit("🔙⏎")), "Statement"),
Rule.new("program", seq(lit("\\A"), rep(lit("❢"), 1), lit("\\z")), "Program"),
]