Support quoted words

This commit is contained in:
Tangent Wantwight 2024-06-08 14:00:45 -04:00
parent ac1a38e75f
commit 6b1c2c48ef

View file

@ -178,6 +178,19 @@ class Parser {
break;
}
case "quote": {
if (wip.startOfWord()) {
wip.addWordPiece({ text: "" }, pos);
this.advance();
this.parseQuoteWord(wip);
this.expect("quote");
wip.freezeWord("Extra characters after quoted word");
} else {
wip.addWordPiece({ bare: chars }, pos);
}
break;
}
case "[": {
this.advance();
const script = this.parseScript();
@ -225,8 +238,55 @@ class Parser {
break;
}
default:
throw new ParseError(
`Unhandled case: ${type satisfies never} (${chars})`,
pos
);
}
this.advance();
}
}
parseQuoteWord(wip: WipScript) {
while (true) {
const [type, chars, pos] = this.next;
switch (type) {
case "text":
case "{":
case "}":
case "]":
case "whitespace":
case "newline":
case "semicolon":
case "comment":
wip.addWordPiece({ text: chars }, pos);
break;
case "[": {
this.advance();
const script = this.parseScript();
wip.addWordPiece({ script }, pos);
this.expect("]");
break;
}
case "EOF":
throw new ParseError(
"Reached end of input while parsing a quoted word",
pos
);
case "backslash": {
this.advance();
this.parseBackslashEscape(wip, "quote");
break;
}
case "quote":
throw new Error(`Unhandled case: ${type} (${chars})`);
return;
default:
throw new ParseError(
`Unhandled case: ${type satisfies never} (${chars})`,