fix:对于const重复定义检查错误 (#85)
Some checks failed
Integration Test / Open-Set-Test (push) Has been cancelled
Test canon project / Test-Canon (push) Has been cancelled
Some checks failed
Integration Test / Open-Set-Test (push) Has been cancelled
Test canon project / Test-Canon (push) Has been cancelled
Reviewed-on: PostGuard/Canon#85
This commit is contained in:
@@ -31,7 +31,7 @@ public class CodeGeneratorVisitor(ICompilerLogger? logger = null) : TypeCheckVis
|
||||
|
||||
public override void PostVisit(ConstDeclaration constDeclaration)
|
||||
{
|
||||
base.PreVisit(constDeclaration);
|
||||
base.PostVisit(constDeclaration);
|
||||
|
||||
(IdentifierSemanticToken token, ConstValue constValue) = constDeclaration.ConstValue;
|
||||
|
||||
|
@@ -31,7 +31,7 @@ public abstract class PascalType : IEquatable<PascalType>
|
||||
return false;
|
||||
}
|
||||
|
||||
return IsReference == other.IsReference;
|
||||
return true;
|
||||
}
|
||||
|
||||
public T Convert<T>() where T : PascalType
|
||||
|
@@ -44,7 +44,16 @@ public class SymbolTable
|
||||
/// </summary>
|
||||
/// <param name="symbol">欲添加的符号</param>
|
||||
/// <returns>是否添加成功</returns>
|
||||
public bool TryAddSymbol(Symbol symbol) => _symbols.TryAdd(symbol.SymbolName, symbol);
|
||||
public bool TryAddSymbol(Symbol symbol)
|
||||
{
|
||||
if (_symbols.ContainsKey(symbol.SymbolName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
_symbols.Add(symbol.SymbolName, symbol);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试从符号表极其父符号表查找符号
|
||||
|
@@ -22,7 +22,7 @@ public class TypeCheckVisitor(ICompilerLogger? logger = null) : SyntaxNodeVisito
|
||||
|
||||
public override void PreVisit(ConstDeclaration constDeclaration)
|
||||
{
|
||||
base.PostVisit(constDeclaration);
|
||||
base.PreVisit(constDeclaration);
|
||||
|
||||
(IdentifierSemanticToken token, ConstValue constValue) = constDeclaration.ConstValue;
|
||||
|
||||
|
@@ -54,4 +54,14 @@ public class SymbolTableTests
|
||||
Assert.True(table.TryGetSymbol("temperature", out Symbol? temp));
|
||||
Assert.Equal(PascalBasicType.Real, temp.SymbolType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DuplicatedTest()
|
||||
{
|
||||
SymbolTable table = new();
|
||||
|
||||
Assert.True(table.TryAddSymbol(
|
||||
new Symbol{SymbolName = "a", SymbolType = PascalBasicType.Integer, Const = true}));
|
||||
Assert.False(table.TryAddSymbol(new Symbol{SymbolName = "a", SymbolType = PascalBasicType.Boolean}));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user