Further cut down the amount of unnecessary coderegions
This commit is contained in:
parent
40c744119c
commit
28f110e2c4
118
Parser.cs
118
Parser.cs
@ -4,7 +4,7 @@ using System.Text.Json.Serialization;
|
||||
|
||||
namespace luaaaaah;
|
||||
|
||||
class Parser
|
||||
internal class Parser
|
||||
{
|
||||
public class ChunkNode(BlockNode block, CodeRegion startRegion, CodeRegion endRegion)
|
||||
{
|
||||
@ -116,12 +116,12 @@ class Parser
|
||||
public ExplistNode rhs = rhs;
|
||||
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 string? objectArg = objectArg;
|
||||
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)
|
||||
{
|
||||
@ -192,11 +192,11 @@ class Parser
|
||||
public abstract class SuffixexpNode(CodeRegion startRegion, CodeRegion 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 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;
|
||||
}
|
||||
@ -231,38 +231,53 @@ class Parser
|
||||
[JsonDerivedType(typeof(Tableconstructor), typeDiscriminator: "e Tableconstructor")]
|
||||
[JsonDerivedType(typeof(Unop), typeDiscriminator: "e Unop")]
|
||||
[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(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 class Nil(CodeRegion region) : ExpNode
|
||||
{
|
||||
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 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 class Varargs(CodeRegion region) : ExpNode(region, region) { }
|
||||
public class Functiondef(FuncbodyNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion)
|
||||
public class Varargs(CodeRegion region) : ExpNode
|
||||
{
|
||||
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 class Suffixexp(SuffixexpNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion)
|
||||
public class Suffixexp(SuffixexpNode node) : ExpNode
|
||||
{
|
||||
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 class Unop(UnopNode node, CodeRegion startRegion, CodeRegion endRegion) : ExpNode(startRegion, endRegion)
|
||||
public class Unop(UnopNode node) : ExpNode
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -409,7 +424,7 @@ class Parser
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -431,11 +446,11 @@ class Parser
|
||||
public abstract class FieldNode(CodeRegion startRegion, CodeRegion 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 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;
|
||||
}
|
||||
@ -577,7 +592,7 @@ class Parser
|
||||
}
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
@ -1014,7 +1029,7 @@ class Parser
|
||||
{
|
||||
index += 1;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
index += 1;
|
||||
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;
|
||||
case TokenType.RoundOpen:
|
||||
@ -1067,32 +1082,20 @@ class Parser
|
||||
SuffixexpSuffix.Args args => new SuffixexpNode.Functioncall(
|
||||
node: new(
|
||||
function: new SuffixexpNode.Normal(
|
||||
node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion),
|
||||
startRegion: startRegion,
|
||||
endRegion: args.endRegion
|
||||
node: new NormalSuffixNode(firstPart, suffixes[..^1], startRegion, args.endRegion)
|
||||
),
|
||||
args: args.node,
|
||||
objectArg: null,
|
||||
startRegion: startRegion,
|
||||
endRegion: args.endRegion
|
||||
),
|
||||
startRegion: startRegion,
|
||||
endRegion: args.endRegion
|
||||
objectArg: null
|
||||
)
|
||||
),
|
||||
SuffixexpSuffix.ArgsFirstArg node => new SuffixexpNode.Functioncall(
|
||||
node: new(
|
||||
function: new SuffixexpNode.Normal(
|
||||
node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion),
|
||||
startRegion: startRegion,
|
||||
endRegion: node.endRegion
|
||||
node: new NormalSuffixNode(firstPart: firstPart, suffixes: suffixes[..^1], startRegion, node.endRegion)
|
||||
),
|
||||
objectArg: node.node.name,
|
||||
args: node.node.rest,
|
||||
startRegion: startRegion,
|
||||
endRegion: node.endRegion
|
||||
),
|
||||
startRegion: startRegion,
|
||||
endRegion: node.endRegion
|
||||
args: node.node.rest
|
||||
)
|
||||
),
|
||||
_ => null,
|
||||
};
|
||||
@ -1106,11 +1109,7 @@ class Parser
|
||||
endRegion = firstPart.endRegion;
|
||||
}
|
||||
|
||||
return new SuffixexpNode.Normal(
|
||||
node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion),
|
||||
startRegion: startRegion,
|
||||
endRegion: endRegion
|
||||
);
|
||||
return new SuffixexpNode.Normal(node: new(firstPart: firstPart, suffixes: suffixes, startRegion: startRegion, endRegion: endRegion));
|
||||
}
|
||||
|
||||
private ArgsNode ParseArgs(Token[] tokens)
|
||||
@ -1246,7 +1245,7 @@ class Parser
|
||||
}
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
@ -1255,15 +1254,15 @@ class Parser
|
||||
string name = ((Token.StringData)tokens[index].data!).data;
|
||||
index += 2;
|
||||
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);
|
||||
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:
|
||||
{
|
||||
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)
|
||||
{
|
||||
CodeRegion startRegion = tokens[index].region;
|
||||
List<ExpNode> exps = [ParseExp(tokens)];
|
||||
while(index < tokens.Length && tokens[index].type == TokenType.Comma)
|
||||
{
|
||||
index += 1;
|
||||
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)
|
||||
@ -1497,7 +1497,7 @@ class Parser
|
||||
int associativityBoost = (GetPrecedence(tokens[index]) == precedence) ? 0 : 1;
|
||||
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;
|
||||
}
|
||||
@ -1598,7 +1598,7 @@ class Parser
|
||||
case TokenType.CurlyOpen:
|
||||
{
|
||||
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:
|
||||
{
|
||||
@ -1610,30 +1610,30 @@ class Parser
|
||||
{
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
index += 1;
|
||||
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:
|
||||
{
|
||||
SuffixexpNode suffixexp = ParseSuffixExp(tokens);
|
||||
return new ExpNode.Suffixexp(node: suffixexp, startRegion: suffixexp.startRegion, endRegion: suffixexp.endRegion);
|
||||
return new ExpNode.Suffixexp(node: suffixexp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user