public Code EvalLiteralWordAtom(ParseTreeNode node, ref CgContext ctx) { switch (node.Term.Name) { case "identifier": return new Code(EvalIdentifier(node, ref ctx)); case "character": return new Code(EvalCharacter(node, ref ctx)); case "number": return new Code(EvalNumber(node, ref ctx)); case "DifferenceLiteral": { var @base = ctx.GetCurrentAddress(); var target = EvalLiteralWordAtom(node.ChildNodes[0].ChildNodes[0], ref ctx); return ctx.EncodeDifference(new Difference(@base, target)); } case "DifferenceTo": return EvalLiteralWordAtom(node.ChildNodes[0], ref ctx); default: throw new UnexpectedGrammarException(); } }