fix: escape characters within assembly
This commit is contained in:
parent
8558733719
commit
5f8b87221c
@ -7,6 +7,7 @@ object asmGenerator {
|
|||||||
import microWacc._
|
import microWacc._
|
||||||
import assemblyIR._
|
import assemblyIR._
|
||||||
import wacc.types._
|
import wacc.types._
|
||||||
|
import lexer.escapedChars
|
||||||
|
|
||||||
val RAX = Register(RegSize.R64, RegName.AX)
|
val RAX = Register(RegSize.R64, RegName.AX)
|
||||||
val EAX = Register(RegSize.E32, RegName.AX)
|
val EAX = Register(RegSize.E32, RegName.AX)
|
||||||
@ -53,7 +54,7 @@ object asmGenerator {
|
|||||||
List(
|
List(
|
||||||
Directive.Int(str.size),
|
Directive.Int(str.size),
|
||||||
LabelDef(s".L.str$i"),
|
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
|
// TODO: Might want to actually properly handle this with the LinkedHashMap too
|
||||||
def align(): AsmLine = And(RSP, ImmediateVal(-16))
|
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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,17 @@ val errConfig = new ErrorConfig {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
object lexer {
|
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
|
/** Language description for the WACC lexer
|
||||||
*/
|
*/
|
||||||
@ -63,15 +74,9 @@ object lexer {
|
|||||||
textDesc = TextDesc.plain.copy(
|
textDesc = TextDesc.plain.copy(
|
||||||
graphicCharacter = Basic(c => c >= ' ' && c != '\\' && c != '\'' && c != '"'),
|
graphicCharacter = Basic(c => c >= ' ' && c != '\\' && c != '\'' && c != '"'),
|
||||||
escapeSequences = EscapeDesc.plain.copy(
|
escapeSequences = EscapeDesc.plain.copy(
|
||||||
literals = Set('\\', '"', '\''),
|
literals =
|
||||||
mapping = Map(
|
escapedChars.filter { (s, chr) => chr.toChar.toString == s }.map(_._2.toChar).toSet,
|
||||||
"0" -> '\u0000',
|
mapping = escapedChars.filter { (s, chr) => chr.toChar.toString != s }
|
||||||
"b" -> '\b',
|
|
||||||
"t" -> '\t',
|
|
||||||
"n" -> '\n',
|
|
||||||
"f" -> '\f',
|
|
||||||
"r" -> '\r'
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
numericDesc = NumericDesc.plain.copy(
|
numericDesc = NumericDesc.plain.copy(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user