mirror of
https://github.com/Ed94/LangStudies.git
synced 2025-06-15 03:21:46 -07:00
Fleshed out the UI for RegM, fixes to SRegEx
This commit is contained in:
@ -11,7 +11,7 @@ class State :
|
||||
func _init(accepting : bool):
|
||||
self.accepting = accepting
|
||||
|
||||
transitionMap[epsilon] = Array.new()
|
||||
transitionMap[epsilon] = []
|
||||
|
||||
func add_Transition(symbol : string, state : State):
|
||||
if symbol == epsilon :
|
||||
@ -63,7 +63,7 @@ func glyph(symbol : string):
|
||||
|
||||
return NFA.new(start, accepting)
|
||||
|
||||
func repeat(entry : NFA)
|
||||
func repeat(entry : NFA):
|
||||
var start = State.new(false)
|
||||
var accepting = State.new(true)
|
||||
|
||||
|
22
App/RegM/Scripts/RegM_Viewer.gd
Normal file
22
App/RegM/Scripts/RegM_Viewer.gd
Normal file
@ -0,0 +1,22 @@
|
||||
extends Node
|
||||
|
||||
var SRegEx = preload("SRegEx.gd").new()
|
||||
|
||||
onready var RegEx_TEdit = get_node("RegEx_TEdit")
|
||||
onready var SRegEx_TEdit = get_node("SRegEx_TEdit")
|
||||
onready var ToRegEx_Btn = get_node("VBox/ToRegEx_Btn")
|
||||
onready var Back_Btn = get_node("VBox/Back_Btn")
|
||||
|
||||
func to_RegExBtn_pressed():
|
||||
RegEx_TEdit.text = SRegEx.transpile(SRegEx_TEdit.text)
|
||||
|
||||
# for line in SRegEx_TEdit.text.split("\n") :
|
||||
# RegEx_TEdit.text += SRegEx.transpile( line ) + "\n"
|
||||
|
||||
func backBtn_pressed():
|
||||
queue_free()
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
Back_Btn.connect("pressed", self, "backBtn_pressed")
|
||||
ToRegEx_Btn.connect("pressed", self, "to_RegExBtn_pressed")
|
@ -38,8 +38,111 @@ a? a.repeat(0-1)
|
||||
a{5} a.repeat(5)
|
||||
a{2,} a.repeat(2-)
|
||||
a{1,3} a.repeat(1-3)
|
||||
a{5} a.repeat.lazy
|
||||
a{5} a.repeat(0-).lazy
|
||||
a{2,}? a.repeat(2-).lazy
|
||||
ab|cd ab | cd
|
||||
/^\/\*[\s\S]*?\*\// start /* set(whitespace !whitespace).lazy.repeat */
|
||||
```
|
||||
/^\/\*[\s\S]*?\*\// start /* set(whitespace !whitespace).repeat(0-).lazy */
|
||||
```
|
||||
|
||||
```
|
||||
inline
|
||||
word
|
||||
digit
|
||||
whitespace
|
||||
!word
|
||||
!digit
|
||||
!whitespace
|
||||
set(abc)
|
||||
!set(abc)
|
||||
set(a-g)
|
||||
start abc end
|
||||
"string"
|
||||
!"not this string"
|
||||
\-
|
||||
\.
|
||||
\!
|
||||
\|
|
||||
\(
|
||||
\)
|
||||
\"
|
||||
\t
|
||||
\n
|
||||
\r
|
||||
( abc )
|
||||
backref(1)
|
||||
!( abc )
|
||||
look(abc)
|
||||
!look(abc)
|
||||
a.repeat(0-)
|
||||
a.repeat(1-)
|
||||
a.repeat(0-1)
|
||||
a.repeat(5)
|
||||
a.repeat(2-)
|
||||
a.repeat(1-3)
|
||||
a.repeat(0-).lazy
|
||||
a.repeat(2-).lazy
|
||||
ab | cd
|
||||
|
||||
start whitespace
|
||||
start "start"
|
||||
start "end"
|
||||
start \" !set( \" ).repeat(0-) "\
|
||||
start \ \(
|
||||
start \ \)
|
||||
start \(
|
||||
start \)
|
||||
start \-
|
||||
start "digt"
|
||||
start "inline"
|
||||
start "word"
|
||||
start "whitespace"
|
||||
start "lazy"
|
||||
start \."repeat"
|
||||
start \\ \-
|
||||
start \\ \.
|
||||
start \\ \!
|
||||
start \\ \|
|
||||
start \\ \"
|
||||
start "look"
|
||||
start \!
|
||||
start \|
|
||||
start "backref"
|
||||
start "set"
|
||||
start !set(whitespace)
|
||||
|
||||
start // inline.repeat(0-)
|
||||
start /* set(whitespace !whitespace).repeat(0-).lazy */ start
|
||||
start whitespace.repeat(1-)
|
||||
start ,
|
||||
start \.
|
||||
start ;
|
||||
start {
|
||||
start }
|
||||
start "let"
|
||||
start "class"
|
||||
start "while"
|
||||
start "do"
|
||||
start "for"
|
||||
start "def"
|
||||
start "return"
|
||||
start "if"
|
||||
start "else"
|
||||
start "new"
|
||||
start "extends"
|
||||
start "super"
|
||||
start set(> <) =.repeat(0-1)
|
||||
start set(= \!) =
|
||||
start &&
|
||||
start \| \|
|
||||
start \!
|
||||
start set( * / + \- ) =
|
||||
start =
|
||||
start set(+ \-)
|
||||
start set( * / )
|
||||
start "true"
|
||||
start "false"
|
||||
start digit.repeat(1-)
|
||||
start \" !set( \" ).repeat(0-) \"
|
||||
start "null"
|
||||
start "this"
|
||||
start word.repeat(1-)
|
||||
|
@ -364,10 +364,10 @@ func is_RegExToken() :
|
||||
# : expression | expression ..
|
||||
# | expression
|
||||
# ;
|
||||
func parse_OpUnion(endToken : Token):
|
||||
func parse_OpUnion(endToken):
|
||||
var expression = parse_Expression(endToken)
|
||||
|
||||
if NextToken == null || NextToken.Type != TokenType.union :
|
||||
if NextToken == null || NextToken.Type != TokenType.op_union :
|
||||
return expression
|
||||
|
||||
eat(TokenType.op_union)
|
||||
@ -383,17 +383,16 @@ func parse_OpUnion(endToken : Token):
|
||||
# Expression
|
||||
# : EVERYTHING (Almost)
|
||||
# ;
|
||||
func parse_Expression(endToken : Token):
|
||||
func parse_Expression(endToken):
|
||||
var \
|
||||
node = ASTNode.new()
|
||||
node.Type = NodeType.expression
|
||||
node.Value = []
|
||||
|
||||
var sentinel = endToken != null
|
||||
if sentinel :
|
||||
sentinel = NextToken.Type == endToken.Type
|
||||
|
||||
while NextToken != null && !sentinel :
|
||||
while NextToken != null && NextToken.Type != TokenType.op_union :
|
||||
if endToken != null && NextToken.Type == endToken :
|
||||
break
|
||||
|
||||
match NextToken.Type :
|
||||
TokenType.str_start :
|
||||
node.Value.append( parse_StrStart() )
|
||||
@ -718,6 +717,8 @@ func parse_OpLook():
|
||||
node = ASTNode.new()
|
||||
node.Type = NodeType.look
|
||||
node.Value = parse_CaptureGroup()
|
||||
|
||||
return node
|
||||
|
||||
# > Expression
|
||||
# OpNot
|
||||
@ -789,7 +790,7 @@ func parse_OpRepeat():
|
||||
return node
|
||||
|
||||
func parse_Backreference():
|
||||
eat(TokenType.Backreference)
|
||||
eat(TokenType.ref)
|
||||
|
||||
var \
|
||||
node = ASTNode.new()
|
||||
@ -800,8 +801,9 @@ func parse_Backreference():
|
||||
var assertStrTmplt = "Error when parsing a backreference expression: Expected digit but got: {value}"
|
||||
var assertStr = assertStrTmplt.format({"value" : NextToken.Value})
|
||||
|
||||
assert(NextToken.Type == TokenType.glyph_digit, assertStr)
|
||||
assert(NextToken.Type == TokenType.glyph, assertStr)
|
||||
node.Value = NextToken.Value
|
||||
eat(TokenType.glyph)
|
||||
|
||||
eat(TokenType.expr_PEnd)
|
||||
|
||||
@ -870,7 +872,8 @@ func transiple_Union(node : ASTNode):
|
||||
var expressionLeft = node.Value
|
||||
|
||||
if node.Type == NodeType.union :
|
||||
expressionLeft = node.Value[0]
|
||||
expressionLeft = node.Value[0].Value
|
||||
|
||||
|
||||
for entry in expressionLeft :
|
||||
match entry.Type :
|
||||
@ -931,11 +934,11 @@ func transpile_LookAhead(node : ASTNode, negate : bool):
|
||||
var result = ""
|
||||
|
||||
if negate :
|
||||
result += "(?="
|
||||
else :
|
||||
result += "(?!"
|
||||
else :
|
||||
result += "(?="
|
||||
|
||||
result += transiple_Union(node.Value)
|
||||
result += transiple_Union(node.Value.Value)
|
||||
result += ")"
|
||||
|
||||
return result
|
||||
@ -956,13 +959,15 @@ func transpile_Repeat(node : ASTNode):
|
||||
if vrange.Value.size() == 1 :
|
||||
if vrange.Value[0].Value == "0" :
|
||||
result += "*"
|
||||
if vrange.Value[0].Value == "1" :
|
||||
elif vrange.Value[0].Value == "1" :
|
||||
result += "+"
|
||||
else :
|
||||
result += "{" + vrange.Value[0].Value + "," + "}"
|
||||
if vrange.Value.size() == 2 :
|
||||
if vrange.Value[0].Value == "0" && vrange.Value[1].Value == "1" :
|
||||
result += "?"
|
||||
else :
|
||||
result += "{" + vrange.Value[0].Value[0] + "," + vrange.Value[0].Value[1] + "}"
|
||||
result += "{" + vrange.Value[0].Value + "," + vrange.Value[1].Value + "}"
|
||||
else :
|
||||
result += "{" + vrange.Value[0] + "}"
|
||||
|
||||
@ -983,9 +988,9 @@ func transpile_Set(node : ASTNode, negate : bool):
|
||||
if entry.Type == NodeType.op_not :
|
||||
result += transpile_OpNot(entry)
|
||||
elif entry.Type == NodeType.between :
|
||||
result += entry.Value[0]
|
||||
result += entry.Value[0].Value
|
||||
result += "-"
|
||||
result += entry.Value[1]
|
||||
result += entry.Value[1].Value
|
||||
else :
|
||||
result += entry.Value
|
||||
|
||||
|
Reference in New Issue
Block a user