Further cut down the amount of unnecessary coderegions

This commit is contained in:
0x4261756D 2024-02-28 17:41:36 +01:00
parent 40c744119c
commit 28f110e2c4

118
Parser.cs
View File

@ -4,7 +4,7 @@ using System.Text.Json.Serialization;
namespace luaaaaah; namespace luaaaaah;
class Parser internal class Parser
{ {
public class ChunkNode(BlockNode block, CodeRegion startRegion, CodeRegion endRegion) public class ChunkNode(BlockNode block, CodeRegion startRegion, CodeRegion endRegion)
{ {
@ -116,12 +116,12 @@ class Parser
public ExplistNode rhs = rhs; public ExplistNode rhs = rhs;
public CodeRegion startRegion = startRegion, endRegion = endRegion; public CodeRegion startRegion = startRegion, endRegion = endRegion;
} }
public class FunctioncallNode(SuffixexpNode function, string? objectArg, ArgsNode args, CodeRegion startRegion, CodeRegion endRegion) public class FunctioncallNode(SuffixexpNode function, string? objectArg, ArgsNode args)
{ {
public SuffixexpNode function = function; public SuffixexpNode function = function;
public string? objectArg = objectArg; public string? objectArg = objectArg;
public ArgsNode args = args; public ArgsNode args = args;
public CodeRegion startRegion = startRegion, endRegion = endRegion; public CodeRegion startRegion = function.startRegion, endRegion = function.endRegion;
} }
public class WhileNode(ExpNode condition, BlockNode body, CodeRegion startRegion, CodeRegion endRegion) public class WhileNode(ExpNode condition, BlockNode body, CodeRegion startRegion, CodeRegion endRegion)
{ {
@ -192,11 +192,11 @@ class Parser
public abstract class SuffixexpNode(CodeRegion startRegion, CodeRegion endRegion) public abstract class SuffixexpNode(CodeRegion startRegion, CodeRegion endRegion)
{ {
public CodeRegion startRegion = startRegion, endRegion = endRegion; public CodeRegion startRegion = startRegion, endRegion = endRegion;
public class Normal(NormalSuffixNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpNode(startRegion, endRegion) public class Normal(NormalSuffixNode node) : SuffixexpNode(node.startRegion, node.endRegion)
{ {
public NormalSuffixNode node = node; public NormalSuffixNode node = node;
} }
public class Functioncall(FunctioncallNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpNode(startRegion, endRegion) public class Functioncall(FunctioncallNode node) : SuffixexpNode(node.startRegion, node.endRegion)
{ {
public FunctioncallNode node = node; public FunctioncallNode node = node;
} }
@ -231,38 +231,53 @@ class Parser
[JsonDerivedType(typeof(Tableconstructor), typeDiscriminator: "e Tableconstructor")] [JsonDerivedType(typeof(Tableconstructor), typeDiscriminator: "e Tableconstructor")]
[JsonDerivedType(typeof(Unop), typeDiscriminator: "e Unop")] [JsonDerivedType(typeof(Unop), typeDiscriminator: "e Unop")]
[JsonDerivedType(typeof(Binop), typeDiscriminator: "e Binop")] [JsonDerivedType(typeof(Binop), typeDiscriminator: "e Binop")]
public abstract class ExpNode(CodeRegion startRegion, CodeRegion endRegion) public abstract class ExpNode
{ {
public CodeRegion startRegion = startRegion, endRegion = endRegion; public class Nil(CodeRegion region) : ExpNode
public class Nil(CodeRegion region) : ExpNode(region, region) { }
public class False(CodeRegion region) : ExpNode(region, region) { }
public class True(CodeRegion region) : ExpNode(region, region) { }
public class Numeral(INumeral value, CodeRegion region) : ExpNode(region, region)
{ {
public CodeRegion region = region;
}
public class False(CodeRegion region) : ExpNode
{
public CodeRegion region = region;
}
public class True(CodeRegion region) : ExpNode
{
public CodeRegion region = region;
}
public class Numeral(INumeral value, CodeRegion region) : ExpNode
{
public CodeRegion region = region;
public INumeral value = value; public INumeral value = value;
} }
public class LiteralString(string value, CodeRegion region) : ExpNode(region, region) public class LiteralString(string value, CodeRegion region) : ExpNode
{ {
public CodeRegion region = region;
public string value = value; public string value = value;
} }
public class Varargs(CodeRegion region) : ExpNode(region, region) { } public class Varargs(CodeRegion region) : ExpNode
public class Functiondef(FuncbodyNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion)
{ {
public CodeRegion region = region;
}
public class Functiondef(FuncbodyNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode
{
public CodeRegion startRegion = startRegion;
public CodeRegion endRegion = endRegion;
public FuncbodyNode node = node; public FuncbodyNode node = node;
} }
public class Suffixexp(SuffixexpNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) public class Suffixexp(SuffixexpNode node) : ExpNode
{ {
public SuffixexpNode node = node; public SuffixexpNode node = node;
} }
public class Tableconstructor(TableconstructorNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) public class Tableconstructor(TableconstructorNode node) : ExpNode
{ {
public TableconstructorNode node = node; public TableconstructorNode node = node;
} }
public class Unop(UnopNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) public class Unop(UnopNode node) : ExpNode
{ {
public UnopNode node = node; public UnopNode node = node;
} }
public class Binop(BinopNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion) public class Binop(BinopNode node) : ExpNode
{ {
public BinopNode node = node; public BinopNode node = node;
} }
@ -409,7 +424,7 @@ class Parser
{ {
public ArgsNode node = node; public ArgsNode node = node;
} }
public class ArgsFirstArg(ArgsFirstArgNode node, CodeRegion startRegion, CodeRegion endRegion) : SuffixexpSuffix(startRegion, endRegion) public class ArgsFirstArg(ArgsFirstArgNode node) : SuffixexpSuffix(node.startRegion, node.endRegion)
{ {
public ArgsFirstArgNode node = node; public ArgsFirstArgNode node = node;
} }
@ -431,11 +446,11 @@ class Parser
public abstract class FieldNode(CodeRegion startRegion, CodeRegion endRegion) public abstract class FieldNode(CodeRegion startRegion, CodeRegion endRegion)
{ {
public CodeRegion startRegion = startRegion, endRegion = endRegion; public CodeRegion startRegion = startRegion, endRegion = endRegion;
public class IndexedAssignment(IndexedAssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : FieldNode(startRegion, endRegion) public class IndexedAssignment(IndexedAssignmentNode node) : FieldNode(node.startRegion, node.endRegion)
{ {
public IndexedAssignmentNode node = node; public IndexedAssignmentNode node = node;
} }
public class Assignment(FieldAssignmentNode node, CodeRegion startRegion, CodeRegion endRegion) : FieldNode(startRegion, endRegion) public class Assignment(FieldAssignmentNode node) : FieldNode(node.startRegion, node.endRegion)
{ {
public FieldAssignmentNode node = node; public FieldAssignmentNode node = node;
} }
@ -577,7 +592,7 @@ class Parser
} }
index += 1; index += 1;
ExpNode conditon = ParseExp(tokens); ExpNode conditon = ParseExp(tokens);
return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: conditon.endRegion)); return new StatNode.Repeat(new(condition: conditon, body: body, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
case TokenType.If: case TokenType.If:
{ {
@ -1014,7 +1029,7 @@ class Parser
{ {
index += 1; index += 1;
ExpNode inner = ParseExp(tokens); ExpNode inner = ParseExp(tokens);
suffixes.Add(new SuffixexpSuffix.Indexed(node: inner, startRegion: suffixStartRegion, endRegion: inner.endRegion)); suffixes.Add(new SuffixexpSuffix.Indexed(node: inner, startRegion: suffixStartRegion, endRegion: tokens[index - 1].region));
if(index >= tokens.Length) if(index >= tokens.Length)
{ {
throw new Exception($"Index {index} out of bounds of {tokens.Length}, expected `]` to close indexed suffix of suffix-expression starting at {suffixStartRegion}"); throw new Exception($"Index {index} out of bounds of {tokens.Length}, expected `]` to close indexed suffix of suffix-expression starting at {suffixStartRegion}");
@ -1040,7 +1055,7 @@ class Parser
string name = ((Token.StringData)tokens[index].data!).data; string name = ((Token.StringData)tokens[index].data!).data;
index += 1; index += 1;
ArgsNode args = ParseArgs(tokens); ArgsNode args = ParseArgs(tokens);
suffixes.Add(new SuffixexpSuffix.ArgsFirstArg(new(name, rest: args, startRegion: suffixStartRegion, endRegion: args.endRegion), startRegion: suffixStartRegion, endRegion: args.endRegion)); suffixes.Add(new SuffixexpSuffix.ArgsFirstArg(new(name, rest: args, startRegion: suffixStartRegion, endRegion: args.endRegion)));
} }
break; break;
case TokenType.RoundOpen: case TokenType.RoundOpen:
@ -1067,32 +1082,20 @@ class Parser
SuffixexpSuffix.Args args => new SuffixexpNode.Functioncall( SuffixexpSuffix.Args args => new SuffixexpNode.Functioncall(
node: new( node: new(
function: new SuffixexpNode.Normal( function: new SuffixexpNode.Normal(
node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion), node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion)
startRegion: startRegion,
endRegion: args.endRegion
), ),
args: args.node, args: args.node,
objectArg: null, objectArg: null
startRegion: startRegion, )
endRegion: args.endRegion
),
startRegion: startRegion,
endRegion: args.endRegion
), ),
SuffixexpSuffix.ArgsFirstArg node => new SuffixexpNode.Functioncall( SuffixexpSuffix.ArgsFirstArg node => new SuffixexpNode.Functioncall(
node: new( node: new(
function: new SuffixexpNode.Normal( function: new SuffixexpNode.Normal(
node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion), node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion)
startRegion: startRegion,
endRegion: node.endRegion
), ),
objectArg: node.node.name, objectArg: node.node.name,
args: node.node.rest, args: node.node.rest
startRegion: startRegion, )
endRegion: node.endRegion
),
startRegion: startRegion,
endRegion: node.endRegion
), ),
_ => null, _ => null,
}; };
@ -1106,11 +1109,7 @@ class Parser
endRegion = firstPart.endRegion; endRegion = firstPart.endRegion;
} }
return new SuffixexpNode.Normal( return new SuffixexpNode.Normal(node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion));
node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion),
startRegion: startRegion,
endRegion: endRegion
);
} }
private ArgsNode ParseArgs(Token[] tokens) private ArgsNode ParseArgs(Token[] tokens)
@ -1246,7 +1245,7 @@ class Parser
} }
index += 1; index += 1;
ExpNode rhs = ParseExp(tokens); ExpNode rhs = ParseExp(tokens);
return new FieldNode.IndexedAssignment(node: new(index: indexNode, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); return new FieldNode.IndexedAssignment(node: new(index: indexNode, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
case TokenType.Name: case TokenType.Name:
{ {
@ -1255,15 +1254,15 @@ class Parser
string name = ((Token.StringData)tokens[index].data!).data; string name = ((Token.StringData)tokens[index].data!).data;
index += 2; index += 2;
ExpNode rhs = ParseExp(tokens); ExpNode rhs = ParseExp(tokens);
return new FieldNode.Assignment(node: new(lhs: name, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); return new FieldNode.Assignment(node: new(lhs: name, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
ExpNode exp = ParseExp(tokens); ExpNode exp = ParseExp(tokens);
return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: exp.endRegion); return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: tokens[index - 1].region);
} }
default: default:
{ {
ExpNode exp = ParseExp(tokens); ExpNode exp = ParseExp(tokens);
return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: exp.endRegion); return new FieldNode.Exp(node: exp, startRegion: startRegion, endRegion: tokens[index - 1].region);
} }
} }
} }
@ -1463,13 +1462,14 @@ class Parser
private ExplistNode ParseExplist(Token[] tokens) private ExplistNode ParseExplist(Token[] tokens)
{ {
CodeRegion startRegion = tokens[index].region;
List<ExpNode> exps = [ParseExp(tokens)]; List<ExpNode> exps = [ParseExp(tokens)];
while(index < tokens.Length && tokens[index].type == TokenType.Comma) while(index < tokens.Length && tokens[index].type == TokenType.Comma)
{ {
index += 1; index += 1;
exps.Add(ParseExp(tokens)); exps.Add(ParseExp(tokens));
} }
return new ExplistNode(exps: exps, startRegion: exps[0].startRegion, endRegion: exps[^1].endRegion); return new ExplistNode(exps: exps, startRegion: startRegion, endRegion: tokens[index - 1].region);
} }
private ExpNode ParseExp(Token[] tokens) private ExpNode ParseExp(Token[] tokens)
@ -1497,7 +1497,7 @@ class Parser
int associativityBoost = (GetPrecedence(tokens[index]) == precedence) ? 0 : 1; int associativityBoost = (GetPrecedence(tokens[index]) == precedence) ? 0 : 1;
rhs = ParseExpPrecedence(tokens, lhs: rhs, minPrecedence: precedence + associativityBoost); rhs = ParseExpPrecedence(tokens, lhs: rhs, minPrecedence: precedence + associativityBoost);
} }
currentLhs = new ExpNode.Binop(node: new(lhs: currentLhs, type: op, rhs: rhs, startRegion: startRegion, endRegion: rhs.endRegion), startRegion: startRegion, endRegion: rhs.endRegion); currentLhs = new ExpNode.Binop(node: new(lhs: currentLhs, type: op, rhs: rhs, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
return currentLhs; return currentLhs;
} }
@ -1598,7 +1598,7 @@ class Parser
case TokenType.CurlyOpen: case TokenType.CurlyOpen:
{ {
TableconstructorNode inner = ParseTableconstructor(tokens); TableconstructorNode inner = ParseTableconstructor(tokens);
return new ExpNode.Tableconstructor(node: inner, startRegion: inner.startRegion, endRegion: inner.endRegion); return new ExpNode.Tableconstructor(node: inner);
} }
case TokenType.Function: case TokenType.Function:
{ {
@ -1610,30 +1610,30 @@ class Parser
{ {
index += 1; index += 1;
ExpNode unop = ParseExp(tokens); ExpNode unop = ParseExp(tokens);
return new ExpNode.Unop(node: new(type: UnopType.Minus, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); return new ExpNode.Unop(node: new(type: UnopType.Minus, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
case TokenType.Hash: case TokenType.Hash:
{ {
index += 1; index += 1;
ExpNode unop = ParseExp(tokens); ExpNode unop = ParseExp(tokens);
return new ExpNode.Unop(node: new(type: UnopType.Length, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); return new ExpNode.Unop(node: new(type: UnopType.Length, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
case TokenType.Not: case TokenType.Not:
{ {
index += 1; index += 1;
ExpNode unop = ParseExp(tokens); ExpNode unop = ParseExp(tokens);
return new ExpNode.Unop(node: new(type: UnopType.LogicalNot, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); return new ExpNode.Unop(node: new(type: UnopType.LogicalNot, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
case TokenType.Tilde: case TokenType.Tilde:
{ {
index += 1; index += 1;
ExpNode unop = ParseExp(tokens); ExpNode unop = ParseExp(tokens);
return new ExpNode.Unop(node: new(type: UnopType.BinaryNot, exp: unop, startRegion: startRegion, endRegion: unop.endRegion), startRegion: startRegion, endRegion: unop.endRegion); return new ExpNode.Unop(node: new(type: UnopType.BinaryNot, exp: unop, startRegion: startRegion, endRegion: tokens[index - 1].region));
} }
default: default:
{ {
SuffixexpNode suffixexp = ParseSuffixExp(tokens); SuffixexpNode suffixexp = ParseSuffixExp(tokens);
return new ExpNode.Suffixexp(node: suffixexp, startRegion: suffixexp.startRegion, endRegion: suffixexp.endRegion); return new ExpNode.Suffixexp(node: suffixexp);
} }
} }
} }