Skip to content

Instantly share code, notes, and snippets.

@shopetan
Last active December 23, 2017 07:48
Show Gist options
  • Save shopetan/16f95546d0241e6822177aa27e55e78b to your computer and use it in GitHub Desktop.
Save shopetan/16f95546d0241e6822177aa27e55e78b to your computer and use it in GitHub Desktop.
make.io
require './lexer'
$nodeno = 0
def checktoken(f, expected)
if $token == expected
$token = $lexer.lex(){|l|
$lexime=l
}
else
puts "syntax error (#{f}): #{expected} is expected"
exit(1)
end
end
def mF()
s = makelabel("F")
label = $nodeno
$nodeno+=1
case $token
when :lpar
sl = makelabel("(")
sa = arrow("F#{label}", "(#{$nodeno}")
$nodeno += 1
checktoken("mF", :lpar)
sa += arrow("F#{label}", "E#{$nodeno}")
se = mE()
se += makelabel(")")
sa += arrow("F#{label}", ")#{$nodeno}")
$nodeno += 1
checktoken("mF", :rpar)
s += sl + sa + "\n" + se
when :num
sl = makelabel("NUM(#{$lexime})")
sa = arrow("F#{label}", "NUM(#{$lexime})#{$nodeno}")
$nodeno += 1
checktoken("mF", :num)
s += sl + sa + "\n"
else
puts "syntax error (mF): :num or :lpar is expected."
exit(1)
end
s
end
def mTd()
s = makelabel("Td")
label = $nodeno
$nodeno+=1
case $token
when :mult
sl = makelabel("MULT")
checktoken("mTd", :mult)
sa = arrow("Td#{label}", "MULT#{$nodeno}")
$nodeno +=1
sa += arrow("Td#{label}", "F#{$nodeno}")
sf = mF()
sa += arrow("Td#{label}", "Td#{$nodeno}")
st = mTd()
s += sl + sa + "\n" + sf + st
else
sl = makelabel("epsilon")
sa = arrow("Td#{label}", "epsilon#{$nodeno}")
$nodeno +=1
s += sl + sa + "\n"
end
s
end
def mT()
s = makelabel("T")
label = $nodeno
$nodeno+=1
sa = arrow("T#{label}", "F#{$nodeno}")
sf = mF()
sa += arrow("T#{label}", "Td#{$nodeno}")
st = mTd()
s += sa + "\n" + sf + st
end
def mEd()
s = makelabel("Ed")
label = $nodeno
$nodeno+=1
case $token
when :plus
sl = makelabel("PLUS")
checktoken("mEd", :plus)
sa = arrow("Ed#{label}", "PLUS#{$nodeno}")
$nodeno +=1
sa += arrow("Ed#{label}", "T#{$nodeno}")
st = mT()
sa += arrow("Ed#{label}", "Ed#{$nodeno}")
se = mEd()
s += sl + sa + "\n" + st + se
else
sl = makelabel("epsilon")
sa = arrow("Ed#{label}", "epsilon#{$nodeno}")
$nodeno +=1
s += sl + sa + "\n"
end
end
def mE()
s = makelabel("E")
label = $nodeno
$nodeno+=1
sa = arrow("E#{label}", "T#{$nodeno}")
st = mT()
sa += arrow("E#{label}", "Ed#{$nodeno}")
se = mEd()
s += sa + "\n" + st + se
end
def arrow(s, d)
" " + '"' + s + '" -> "' + d + '";' + "\n"
end
def makelabel(l)
" " + '"' + l + $nodeno.to_s + '"' + '[label = "' + l + '"];' + "\n"
end
$lexer = Lexer.new($stdin)
$token = $lexer.lex(){ |l|
$lexime = l
}
s = "digraph {\n"
$nodeno += 1
s += mE
s += "}\n"
puts s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment