Skip to content

Commit b275c20

Browse files
authored
Исправление некорректной грамматики (#28)
* new grammar.txt content * format grammar.txt * grammar fix
1 parent 7474b10 commit b275c20

File tree

15 files changed

+105
-102
lines changed

15 files changed

+105
-102
lines changed

Interpreter.Lib/FrontEnd/TopDownParse/Impl/Parser.cs

+24-36
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private StatementListItem StatementListItem(SymbolTable table)
105105
private Statement Statement(SymbolTable table)
106106
{
107107
if (CurrentIs("Ident") || CurrentIsLiteral() || CurrentIs("LeftParen") || CurrentIsOperator("-") ||
108-
CurrentIsOperator("!"))
108+
CurrentIsOperator("!") || CurrentIsOperator("~"))
109109
{
110110
return ExpressionStatement(table);
111111
}
@@ -177,8 +177,9 @@ private ExpressionStatement ExpressionStatement(SymbolTable table)
177177
private ReturnStatement ReturnStatement(SymbolTable table)
178178
{
179179
var ret = Expect("Keyword", "return");
180-
if (CurrentIs("Ident") || CurrentIsLiteral() || CurrentIs("LeftParen") || CurrentIsOperator("-") ||
181-
CurrentIsOperator("!") || CurrentIs("LeftCurl") || CurrentIs("LeftBracket"))
180+
if (CurrentIs("Ident") || CurrentIsLiteral() || CurrentIs("LeftParen")||
181+
CurrentIsOperator("-") || CurrentIsOperator("!") || CurrentIsOperator("~") ||
182+
CurrentIs("LeftCurl") || CurrentIs("LeftBracket"))
182183
{
183184
return new ReturnStatement(Expression(table))
184185
{
@@ -452,42 +453,19 @@ private void AddToDeclaration(LexicalDeclaration declaration, SymbolTable table)
452453

453454
private Expression Expression(SymbolTable table)
454455
{
455-
return AssignmentExpression(table);
456-
}
457-
458-
private Expression AssignmentExpression(SymbolTable table)
459-
{
460-
var lhs = LeftHandSideExpression(table);
461-
if (CurrentIs("Assign") && !(lhs is CallExpression))
456+
var expr = CastExpression(table);
457+
if (expr is LeftHandSideExpression lhs)
462458
{
463459
var assign = Expect("Assign");
464-
var member = lhs is IdentifierReference reference
465-
? (MemberExpression) reference
466-
: (MemberExpression) lhs;
467-
return new AssignmentExpression(member, AssignmentExpression(table))
460+
return new AssignmentExpression(lhs, Expression(table))
468461
{SymbolTable = table, Segment = assign.Segment};
469462
}
470-
471-
return lhs;
472-
}
473-
474-
private Expression LeftHandSideExpression(SymbolTable table)
475-
{
476-
var expr = CastExpression(table);
477-
if (expr is IdentifierReference identRef)
478-
{
479-
if (CurrentIs("LeftParen") || CurrentIs("LeftBracket") || CurrentIs("Dot"))
480-
{
481-
return CallExpression(identRef, table);
482-
}
483-
}
484-
485463
return expr;
486464
}
487465

488-
private Expression CallExpression(IdentifierReference identRef, SymbolTable table)
466+
private Expression CallExpression(SymbolTable table)
489467
{
490-
var member = MemberExpression(identRef, table);
468+
var member = MemberExpression(table);
491469
if (CurrentIs("LeftParen"))
492470
{
493471
var lp = Expect("LeftParen");
@@ -504,7 +482,7 @@ private Expression CallExpression(IdentifierReference identRef, SymbolTable tabl
504482
}
505483

506484
Expect("RightParen");
507-
return new CallExpression(member, expressions)
485+
return new CallExpression(member as MemberExpression, expressions)
508486
{
509487
SymbolTable = table,
510488
Segment = lp.Segment
@@ -514,8 +492,13 @@ private Expression CallExpression(IdentifierReference identRef, SymbolTable tabl
514492
return member;
515493
}
516494

517-
private MemberExpression MemberExpression(IdentifierReference identRef, SymbolTable table)
495+
private Expression MemberExpression(SymbolTable table)
518496
{
497+
var primary = PrimaryExpression(table);
498+
if (!CurrentIs("LeftBracket") && !CurrentIs("Dot"))
499+
return primary;
500+
501+
var identRef = primary as IdentifierReference;
519502
var accessChain = new List<AccessExpression>();
520503
while (CurrentIs("LeftBracket") || CurrentIs("Dot"))
521504
{
@@ -570,9 +553,9 @@ private Expression ConditionalExpression(SymbolTable table)
570553
if (CurrentIs("QuestionMark"))
571554
{
572555
Expect("QuestionMark");
573-
var consequent = AssignmentExpression(table);
556+
var consequent = Expression(table);
574557
Expect("Colon");
575-
var alternate = AssignmentExpression(table);
558+
var alternate = Expression(table);
576559
return new ConditionalExpression(test, consequent, alternate);
577560
}
578561

@@ -688,7 +671,12 @@ private Expression UnaryExpression(SymbolTable table)
688671
};
689672
}
690673

691-
return PrimaryExpression(table);
674+
return LeftHandSideExpression(table);
675+
}
676+
677+
private Expression LeftHandSideExpression(SymbolTable table)
678+
{
679+
return CallExpression(table);
692680
}
693681

694682
private Expression PrimaryExpression(SymbolTable table)

Interpreter.Lib/IR/Ast/Nodes/Expressions/AccessExpressions/DotAccess.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ public DotAccess(IdentifierReference id, AccessExpression prev = null) : base(pr
1818
_id.Parent = this;
1919
}
2020

21-
public string Id => _id.Id;
21+
public string Id => _id.Name;
2222

2323
public override Type Check(Type prev)
2424
{
2525
if (prev is ObjectType objectType)
2626
{
27-
var fieldType = objectType[_id.Id];
27+
var fieldType = objectType[_id.Name];
2828
if (fieldType != null)
2929
{
3030
return HasNext() ? Next.Check(fieldType) : fieldType;
3131
}
3232

33-
throw new ObjectAccessException(Segment, objectType, _id.Id);
33+
throw new ObjectAccessException(Segment, objectType, _id.Name);
3434
}
3535

3636
return null;

Interpreter.Lib/IR/Ast/Nodes/Expressions/AssignmentExpression.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ namespace Interpreter.Lib.IR.Ast.Nodes.Expressions;
99

1010
public class AssignmentExpression : Expression
1111
{
12-
public MemberExpression Destination { get; }
12+
public LeftHandSideExpression Destination { get; }
1313
public Expression Source { get; }
1414
private readonly Type _destinationType;
1515

16-
public AssignmentExpression(MemberExpression destination, Expression source, Type destinationType = null)
16+
public AssignmentExpression(LeftHandSideExpression lhs, Expression source, Type destinationType = null)
1717
{
18-
Destination = destination;
19-
destination.Parent = this;
18+
Destination = lhs;
19+
lhs.Parent = this;
2020

2121
Source = source;
2222
source.Parent = this;
@@ -32,12 +32,12 @@ internal override Type NodeCheck()
3232
{
3333
if (declaration.Readonly && type.Equals(TypeUtils.JavaScriptTypes.Undefined))
3434
{
35-
throw new ConstWithoutInitializer(Destination);
35+
throw new ConstWithoutInitializer(Destination.Id);
3636
}
3737

3838
if (SymbolTable.ContainsSymbol(Destination.Id))
3939
{
40-
throw new DeclarationAlreadyExists(Destination);
40+
throw new DeclarationAlreadyExists(Destination.Id);
4141
}
4242

4343
if (_destinationType != null && type.Equals(TypeUtils.JavaScriptTypes.Undefined))
@@ -77,7 +77,7 @@ internal override Type NodeCheck()
7777
{
7878
if (symbol.ReadOnly)
7979
{
80-
throw new AssignmentToConst(Destination);
80+
throw new AssignmentToConst(Destination.Id);
8181
}
8282

8383
if (!Destination.NodeCheck().Equals(type))

Interpreter.Lib/IR/Ast/Nodes/Expressions/CallExpression.cs

+18-15
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,29 @@
1111

1212
namespace Interpreter.Lib.IR.Ast.Nodes.Expressions;
1313

14-
public class CallExpression : Expression
14+
public class CallExpression : LeftHandSideExpression
1515
{
16-
private readonly MemberExpression _ident;
16+
private readonly MemberExpression _member;
1717
private readonly List<Expression> _expressions;
1818

19-
public CallExpression(MemberExpression ident, IEnumerable<Expression> expressions)
19+
public CallExpression(MemberExpression member, IEnumerable<Expression> expressions)
2020
{
21-
_ident = ident;
22-
_ident.Parent = this;
21+
_member = member;
22+
_member.Parent = this;
2323

2424
_expressions = new List<Expression>(expressions);
2525
_expressions.ForEach(expr => expr.Parent = this);
2626
}
27+
28+
public override IdentifierReference Id =>
29+
_member.Id;
2730

2831
private FunctionSymbol GetFunction()
2932
{
30-
if (_ident.Any())
33+
if (_member.Any())
3134
{
32-
var table = SymbolTable.FindSymbol<ObjectSymbol>(_ident.Id).Table;
33-
var chain = _ident.AccessChain;
35+
var table = SymbolTable.FindSymbol<ObjectSymbol>(_member.Id).Table;
36+
var chain = _member.AccessChain;
3437
while (chain.HasNext())
3538
{
3639
table = chain switch
@@ -45,25 +48,25 @@ private FunctionSymbol GetFunction()
4548
return table.FindSymbol<FunctionSymbol>(((DotAccess) chain).Id);
4649
}
4750

48-
return SymbolTable.FindSymbol<FunctionSymbol>(_ident.Id);
51+
return SymbolTable.FindSymbol<FunctionSymbol>(_member.Id);
4952
}
5053

5154
internal override Type NodeCheck()
5255
{
53-
if (_ident.Any())
56+
if (_member.Any())
5457
{
55-
_ident.NodeCheck();
58+
_member.NodeCheck();
5659
}
5760
else
5861
{
59-
IdentifierReference idRef = _ident;
62+
IdentifierReference idRef = _member.Id;
6063
idRef.NodeCheck();
6164
}
6265

6366
var function = GetFunction();
6467
if (function == null)
6568
{
66-
throw new SymbolIsNotCallable(_ident.Id, Segment);
69+
throw new SymbolIsNotCallable(_member.Id, Segment);
6770
}
6871

6972
if (!function.Type.ReturnType.Equals(TypeUtils.JavaScriptTypes.Void))
@@ -91,7 +94,7 @@ internal override Type NodeCheck()
9194
throw new WrongReturnType(retStmt.Segment, function.Type.ReturnType, retType);
9295
}
9396

94-
if (node.CanEvaluate && !(node is CallExpression call && call._ident.Id == _ident.Id))
97+
if (node.CanEvaluate && !(node is CallExpression call && call._member.Id == _member.Id))
9598
{
9699
node.NodeCheck();
97100
}
@@ -105,7 +108,7 @@ public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
105108
{
106109
var nodes = new List<AbstractSyntaxTreeNode>
107110
{
108-
_ident
111+
_member
109112
};
110113
nodes.AddRange(_expressions);
111114
return nodes.GetEnumerator();

Interpreter.Lib/IR/Ast/Nodes/Expressions/ComplexLiterals/ObjectLiteral.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ internal override Type NodeCheck()
2626
Properties.ForEach(prop =>
2727
{
2828
var propType = prop.Expression.NodeCheck();
29-
propertyTypes.Add(new PropertyType(prop.Id.Id, propType));
29+
propertyTypes.Add(new PropertyType(prop.Id.Name, propType));
3030
prop.Id.SymbolTable.AddSymbol(propType is ObjectType objectType
31-
? new ObjectSymbol(prop.Id.Id, objectType) {Table = prop.Expression.SymbolTable}
32-
: new VariableSymbol(prop.Id.Id, propType)
31+
? new ObjectSymbol(prop.Id.Name, objectType) {Table = prop.Expression.SymbolTable}
32+
: new VariableSymbol(prop.Id.Name, propType)
3333
);
3434
});
3535
Methods.ForEach(m =>

Interpreter.Lib/IR/Ast/Nodes/Expressions/ComplexLiterals/Property.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public Property(IdentifierReference id, Expression expression)
2323

2424
public void Deconstruct(out string id, out Expression expr)
2525
{
26-
id = Id.Id;
26+
id = Id.Name;
2727
expr = Expression;
2828
}
2929

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Interpreter.Lib.IR.Ast.Nodes.Expressions.PrimaryExpressions;
2+
3+
namespace Interpreter.Lib.IR.Ast.Nodes.Expressions;
4+
5+
public abstract class LeftHandSideExpression : Expression
6+
{
7+
public abstract IdentifierReference Id { get; }
8+
}

Interpreter.Lib/IR/Ast/Nodes/Expressions/MemberExpression.cs

+10-15
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88

99
namespace Interpreter.Lib.IR.Ast.Nodes.Expressions;
1010

11-
public class MemberExpression : Expression
11+
public class MemberExpression : LeftHandSideExpression
1212
{
13-
private readonly IdentifierReference _id;
13+
private readonly IdentifierReference _identifierReference;
1414

1515
public AccessExpression AccessChain { get; }
1616

17-
public MemberExpression(IdentifierReference id, AccessExpression accessChain)
17+
public MemberExpression(IdentifierReference identifierReference, AccessExpression accessChain)
1818
{
19-
_id = id;
20-
_id.Parent = this;
19+
_identifierReference = identifierReference;
20+
_identifierReference.Parent = this;
2121

2222
AccessChain = accessChain;
2323
if (accessChain != null)
@@ -26,19 +26,20 @@ public MemberExpression(IdentifierReference id, AccessExpression accessChain)
2626
}
2727
}
2828

29-
public string Id => _id.Id;
29+
public override IdentifierReference Id =>
30+
_identifierReference;
3031

3132
internal override Type NodeCheck()
3233
{
3334
if (AccessChain == null)
3435
{
35-
return _id.NodeCheck();
36+
return _identifierReference.NodeCheck();
3637
}
3738

38-
var symbol = SymbolTable.FindSymbol<VariableSymbol>(_id.Id);
39+
var symbol = SymbolTable.FindSymbol<VariableSymbol>(_identifierReference);
3940
if (symbol == null)
4041
{
41-
throw new UnknownIdentifierReference(_id);
42+
throw new UnknownIdentifierReference(_identifierReference);
4243
}
4344

4445
return AccessChain.Check(symbol.Type);
@@ -64,12 +65,6 @@ public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
6465
return new();
6566
}*/
6667

67-
public static implicit operator IdentifierReference(MemberExpression member) =>
68-
member._id;
69-
70-
public static explicit operator MemberExpression(IdentifierReference idRef) =>
71-
new (idRef, null);
72-
7368
public override AddressedInstructions Accept(ExpressionInstructionProvider visitor)
7469
{
7570
throw new NotImplementedException();

0 commit comments

Comments
 (0)