diff --git a/Parser.cs b/Parser.cs index 3113a2e..683f9b7 100644 --- a/Parser.cs +++ b/Parser.cs @@ -32,61 +32,76 @@ class Parser [JsonDerivedType(typeof(Function), typeDiscriminator: "st Function")] [JsonDerivedType(typeof(LocalFunction), typeDiscriminator: "st LocalFunction")] [JsonDerivedType(typeof(Local), typeDiscriminator: "st Local")] - public abstract class StatNode(CodeRegion startRegion, CodeRegion endRegion) + public abstract class StatNode { - public CodeRegion startRegion = startRegion, endRegion = endRegion; - public class Semicolon(CodeRegion region) : StatNode(region, region) { } - public class Assignment(AssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Semicolon(CodeRegion region) : StatNode + { + public CodeRegion region = region; + } + public class Assignment(AssignmentNode node) : StatNode { public AssignmentNode node = node; } - public class Functioncall(FunctioncallNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Functioncall(FunctioncallNode node) : StatNode { public FunctioncallNode node = node; } - public class Label(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Label(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public string label = label; } - public class Break(CodeRegion region) : StatNode(region, region) { } - public class Goto(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Break(CodeRegion region) : StatNode { + public CodeRegion region = region; + } + public class Goto(string label, CodeRegion startRegion, CodeRegion endRegion) : StatNode + { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public string label = label; } - public class Do(BlockNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Do(BlockNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public BlockNode node = node; } - public class While(WhileNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class While(WhileNode node) : StatNode { public WhileNode node = node; } - public class Repeat(RepeatNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Repeat(RepeatNode node) : StatNode { public RepeatNode node = node; } - public class If(IfNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class If(IfNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public IfNode node = node; } - public class ForNumerical(ForNumericalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class ForNumerical(ForNumericalNode node) : StatNode { public ForNumericalNode node = node; } - public class ForGeneric(ForGenericNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class ForGeneric(ForGenericNode node) : StatNode { public ForGenericNode node = node; } - public class Function(FunctionNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Function(FunctionNode node) : StatNode { public FunctionNode node = node; } - public class LocalFunction(LocalFunctionNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class LocalFunction(LocalFunctionNode node) : StatNode { public LocalFunctionNode node = node; } - public class Local(LocalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode(startRegion, endRegion) + public class Local(LocalNode node, CodeRegion startRegion, CodeRegion endRegion) : StatNode { + public CodeRegion startRegion = startRegion; + public CodeRegion endRegion = endRegion; public LocalNode node = node; } } @@ -468,7 +483,7 @@ class Parser { stats.Add(ParseStat(tokens)); } - BlockNode ret = new(stats: stats, startRegion: startRegion, endRegion: (stats.Count == 0) ? startRegion : stats[^1].endRegion); + BlockNode ret = new(stats: stats, startRegion: startRegion, endRegion: (stats.Count == 0 && index > 0) ? startRegion : tokens[index - 1].region); if(index < tokens.Length && tokens[index].type == TokenType.Return) { ret.retstat = ParseRetstat(tokens); @@ -546,7 +561,7 @@ class Parser } CodeRegion endRegion = tokens[index].region; index += 1; - return new StatNode.While(new(condition: condition, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); + return new StatNode.While(new(condition: condition, body: body, startRegion: startRegion, endRegion: endRegion)); } case TokenType.Repeat: { @@ -562,7 +577,7 @@ class Parser } index += 1; ExpNode conditon = ParseExp(tokens); - return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion), startRegion: startRegion, endRegion: conditon.endRegion); + return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion)); } case TokenType.If: { @@ -683,7 +698,7 @@ class Parser } CodeRegion endRegion = tokens[index].region; index += 1; - return new StatNode.ForNumerical(new(variable: variable, start: start, end: end, change: change, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); + return new StatNode.ForNumerical(new(variable: variable, start: start, end: end, change: change, body: body, startRegion: startRegion, endRegion: endRegion)); } case TokenType.Comma: { @@ -736,7 +751,7 @@ class Parser } CodeRegion endRegion = tokens[index].region; index += 1; - return new StatNode.ForGeneric(new(vars: names, exps: exps, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); + return new StatNode.ForGeneric(new(vars: names, exps: exps, body: body, startRegion: startRegion, endRegion: endRegion)); } case TokenType.In: { @@ -762,7 +777,7 @@ class Parser } CodeRegion endRegion = tokens[index].region; index += 1; - return new StatNode.ForGeneric(new(vars: [variable], exps: exps, body: body, startRegion: startRegion, endRegion: endRegion), startRegion: startRegion, endRegion: endRegion); + return new StatNode.ForGeneric(new(vars: [variable], exps: exps, body: body, startRegion: startRegion, endRegion: endRegion)); } default: { @@ -775,7 +790,7 @@ class Parser index += 1; FuncnameNode name = ParseFuncname(tokens); FuncbodyNode body = ParseFuncbody(tokens); - return new StatNode.Function(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion), startRegion: startRegion, endRegion: body.endRegion); + return new StatNode.Function(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion)); } case TokenType.Local: { @@ -798,7 +813,7 @@ class Parser string name = ((Token.StringData)tokens[index].data!).data; index += 1; FuncbodyNode body = ParseFuncbody(tokens); - return new StatNode.LocalFunction(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion), startRegion: startRegion, endRegion: body.endRegion); + return new StatNode.LocalFunction(new(name: name, body: body, startRegion: startRegion, endRegion: body.endRegion)); } else { @@ -850,7 +865,7 @@ class Parser } if(suffixExp is SuffixexpNode.Functioncall functioncall) { - return new StatNode.Functioncall(node: functioncall.node, startRegion: functioncall.startRegion, endRegion: functioncall.endRegion); + return new StatNode.Functioncall(node: functioncall.node); } } else @@ -862,7 +877,7 @@ class Parser index += 1; List lhs = [SuffixExpToVar(suffixExp)]; ExplistNode rhs = ParseExplist(tokens); - return new StatNode.Assignment(new(lhs: new(vars: lhs, startRegion: startRegion, endRegion: suffixExp.endRegion), rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); + return new StatNode.Assignment(new(lhs: new(vars: lhs, startRegion: startRegion, endRegion: suffixExp.endRegion), rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion)); } case TokenType.Comma: { @@ -883,7 +898,7 @@ class Parser index += 1; VarlistNode varlistNode = new(vars: vars, startRegion: startRegion, endRegion: vars[^1].endRegion); ExplistNode rhs = ParseExplist(tokens); - return new StatNode.Assignment(new(lhs: varlistNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); + return new StatNode.Assignment(new(lhs: varlistNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion)); } } if(suffixExp is SuffixexpNode.Normal) @@ -892,7 +907,7 @@ class Parser } if(suffixExp is SuffixexpNode.Functioncall functioncall) { - return new StatNode.Functioncall(node: functioncall.node, startRegion: functioncall.startRegion, endRegion: functioncall.endRegion); + return new StatNode.Functioncall(node: functioncall.node); } } }