Login
gpcr/examples/robots_grammar.cr
Login

[edit]

examples/robots_grammar.cr @ trunk

../src/gpcr/regex_subset

require '../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)

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"),
]