Skip to content

Commit

Permalink
fix some inconsistency during converting
Browse files Browse the repository at this point in the history
  • Loading branch information
tiye committed Sep 13, 2024
1 parent 58d33f5 commit 4ae1ae1
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 64 deletions.
79 changes: 16 additions & 63 deletions lib/parser.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -85,50 +85,36 @@ fn lex(initial_code : String) -> Array[CirruLexItem]!CirruParseError {
let mut state = CirruLexState::Indent
let mut buffer = ""
let code = initial_code.to_array()
let mut idx = 0
while idx < code.length() {
let c = code[idx]
for idx, c in code {
// println("lexing \{c} in \{state} and \{buffer}")
match state {
CirruLexState::Space =>
match c {
' ' => {
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
'\n' => {
state = CirruLexState::Indent
buffer = ""
idx += 1
continue
}
'(' => {
acc.push(CirruLexItem::Open)
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
')' => {
acc.push(CirruLexItem::Close)
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
'"' => {
state = CirruLexState::Str
buffer = ""
idx += 1
continue
}
_ => {
state = CirruLexState::Token
buffer = c.to_string()
idx += 1
continue
}
}
CirruLexState::Token =>
Expand All @@ -137,43 +123,32 @@ fn lex(initial_code : String) -> Array[CirruLexItem]!CirruParseError {
acc.push(CirruLexItem::Str(buffer))
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
'"' => {
acc.push(CirruLexItem::Str(buffer))
state = CirruLexState::Str
buffer = ""
idx += 1
continue
}
'\n' => {
acc.push(CirruLexItem::Str(buffer))
state = CirruLexState::Indent
buffer = ""
idx += 1
continue
}
'(' => {
acc.push(CirruLexItem::Str(buffer))
acc.push(CirruLexItem::Open)
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
')' => {
acc.push(CirruLexItem::Str(buffer))
acc.push(CirruLexItem::Close)
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
_ => {
state = CirruLexState::Token
buffer += c.to_string()
idx += 1
continue
}
}
CirruLexState::Str =>
Expand All @@ -182,67 +157,55 @@ fn lex(initial_code : String) -> Array[CirruLexItem]!CirruParseError {
acc.push(CirruLexItem::Str(buffer))
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
'\\' => {
state = CirruLexState::Escape
buffer = ""
idx += 1
continue
}
'\\' => state = CirruLexState::Escape
'\n' => raise CirruParseError("unexpected newline in string")
_ => {
state = CirruLexState::Str
buffer += c.to_string()
idx += 1
continue
}
}
CirruLexState::Escape =>
match c {
'"' => {
state = CirruLexState::Str
buffer += "\""
idx += 1
continue
}
'\'' => {
state = CirruLexState::Str
buffer += "'"
idx += 1
continue
}
't' => {
state = CirruLexState::Str
buffer += "\t"
idx += 1
continue
}
'n' => {
state = CirruLexState::Str
buffer += "\n"
idx += 1
continue
}
'r' => {
state = CirruLexState::Str
buffer += "\r"
idx += 1
continue
}
'u' => {
// TODO handle some unicode
let end = idx + 10
// TODO
let peek = if end >= code.length() {
code[idx:]
} else {
code[idx:end]
}
let mut preview = ""
for c in peek {
preview += c.to_string()
}
println("Unicode escaping is not supported yet: \{preview} ...")
buffer += "\\u"
state = CirruLexState::Str
idx += 1
continue
}
'\\' => {
state = CirruLexState::Str
buffer += "\\"
idx += 1
continue
}
_ =>
raise CirruParseError(
Expand All @@ -254,40 +217,30 @@ fn lex(initial_code : String) -> Array[CirruLexItem]!CirruParseError {
' ' => {
state = CirruLexState::Indent
buffer += c.to_string()
idx += 1
continue
}
'\n' => {
state = CirruLexState::Indent
buffer += ""
idx += 1
continue
buffer = ""
}
'"' => {
let level = parse_indentation!(buffer.length())
acc.push(level)
state = CirruLexState::Str
buffer = ""
idx += 1
continue
}
'(' => {
let level = parse_indentation!(buffer.length())
acc.push(level)
acc.push(CirruLexItem::Open)
state = CirruLexState::Space
buffer = ""
idx += 1
continue
}
')' => raise CirruParseError("unexpected ) at line start")
_ => {
let level = parse_indentation!(buffer.length())
acc.push(level)
state = CirruLexState::Token
buffer = c.to_string()
idx += 1
continue
}
}
}
Expand Down
7 changes: 6 additions & 1 deletion lib/primes.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@ pub fn output(self : Cirru, logger : Logger) -> Unit {

pub fn to_string(self : Cirru) -> String {
match self {
Cirru::Leaf(s) => s
Cirru::Leaf(s) =>
if CirruLexItem::is_normal_str(s) {
return s
} else {
return escape_cirru_leaf(s)
}
Cirru::List(xs) => {
let mut out = ""
for i = 0; i < xs.length(); i = i + 1 {
Expand Down

0 comments on commit 4ae1ae1

Please sign in to comment.