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;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user