diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 27eb1ec..3a73ce9 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -7,6 +7,7 @@ object asmGenerator { import microWacc._ import assemblyIR._ import wacc.types._ + import lexer.escapedChars val RAX = Register(RegSize.R64, RegName.AX) val EAX = Register(RegSize.E32, RegName.AX) @@ -53,7 +54,7 @@ object asmGenerator { List( Directive.Int(str.size), LabelDef(s".L.str$i"), - Directive.Asciz(str.replace("\"", "\\\"")) + Directive.Asciz(str.escaped) ) } @@ -387,4 +388,10 @@ object asmGenerator { // TODO: Might want to actually properly handle this with the LinkedHashMap too def align(): AsmLine = And(RSP, ImmediateVal(-16)) } + + private val escapedCharsMapping = escapedChars.map { case (k, v) => v -> s"\\$k" } + extension (s: String) { + private def escaped: String = + s.flatMap(c => escapedCharsMapping.getOrElse(c, c.toString)) + } } diff --git a/src/main/wacc/frontend/lexer.scala b/src/main/wacc/frontend/lexer.scala index 2efe517..4cb51a8 100644 --- a/src/main/wacc/frontend/lexer.scala +++ b/src/main/wacc/frontend/lexer.scala @@ -39,6 +39,17 @@ val errConfig = new ErrorConfig { ) } object lexer { + val escapedChars: Map[String, Int] = Map( + "0" -> '\u0000', + "b" -> '\b', + "t" -> '\t', + "n" -> '\n', + "f" -> '\f', + "r" -> '\r', + "\\" -> '\\', + "'" -> '\'', + "\"" -> '\"' + ) /** Language description for the WACC lexer */ @@ -63,15 +74,9 @@ object lexer { textDesc = TextDesc.plain.copy( graphicCharacter = Basic(c => c >= ' ' && c != '\\' && c != '\'' && c != '"'), escapeSequences = EscapeDesc.plain.copy( - literals = Set('\\', '"', '\''), - mapping = Map( - "0" -> '\u0000', - "b" -> '\b', - "t" -> '\t', - "n" -> '\n', - "f" -> '\f', - "r" -> '\r' - ) + literals = + escapedChars.filter { (s, chr) => chr.toChar.toString == s }.map(_._2.toChar).toSet, + mapping = escapedChars.filter { (s, chr) => chr.toChar.toString != s } ) ), numericDesc = NumericDesc.plain.copy(