pascalabcnet/Languages/Oberon/Oberon00Parser/LanguageInformation.cs
AlexanderZemlyak 342375501b
New languages engine (#3120)
* Implement first version of languages interfaces and classes

ParsersController заменен на LanguageProvider.

* Update ParserTools.csproj

* Update RemoteCompiler.cs

* Update TestRunner

* Rename LanguageIntegrator project to Languages

* Update TestRunner

* Rename Parsers folder

* Rename PascalABCParser.dll to PascalABCLanguage.dll

* Reorganise LanguageIntegrator and rename DocTagsParser

* Update Release Generators

* Update language loading messages

* Update linux version

* Move BaseParser fields to ILanguage interface

* Revert "Update Release Generators"

This reverts commit 26a991c71b81e643d9fbd9a815ddca222768dda9.

* Revert "Rename PascalABCParser.dll to PascalABCLanguage.dll"

* Clean the mess in parser folders

* Organize namespaces properly

* Revert "Rename LanguageIntegrator project to Languages"

* Add new enclosing folders for standard languages

* Organize namespaces of LanguageIntegrator properly

* Rename StandardLanguages to Languages

* Comment the rest of Visual basic source code

* Update OutputPath in pascal parser project

* Move BaseParser methods to IParser

* Restore Pascal parser project initial structure

* Add PascalLanguage project

* Move SyntaxTreeConverters project to Languages\Pascal folder

* Rename SemanticRules in parser project

* Rename Errors1 to Errors in parser project

* Delete LambdaConverter dll from installer

* Update language integrator to load *Language.dll files

* Move lambda converter project to pascal lanuage dir

* Revert "Delete LambdaConverter dll from installer"

This reverts commit dd56f559ebe4f8c4c5c33752d44e6953001b96a5.

* Switch off VBNETParser building

* Delete syntax tree converters controller

* Delete lambda converter dll from repository

* Reorganize syntax tree to semantic tree conversion stage

* Add BaseLanguage class to make language initialization more neat

* Delete syntax tree post processors entity from ILanguage and refactor ABCStatistics calls

* Add new IDocParser interface for documentation comments parser

* Clean up folders

* Add helper data structures to reduce parameters amount in CompileInterface and CompileImplementation

* Add documentation to language classes

* Move Union struct in global namespace and project (ParserTools)

* Add more comments and a safe select language method

* Rename SemanticRules class

* Fix directives format null bug

* Add System.Linq ref to LanguageIntegrator

* Delete SyntaxToSemanticTreeConverter interface

* Add BaseSyntaxTreeConverter

* Call safe select language method in intellisence

* Delete source files providers from parsers

* Rename GetSyntaxTree method

* Change Prebuild tree to be virtual - not abstract

* Refresh documentation a bit

* Add temporary language check for ABCHealth button

* Add parser reference to parser tools

* Move current compilation unit assigning higher to avoid bug with unit check

* Delete null DirectiveInfo's and refactor directives' code

* Add a few more comments
2024-05-25 12:26:32 +03:00

152 lines
5.1 KiB
C#

using System;
using System.IO;
using System.Text;
using System.Reflection;
using PascalABCCompiler;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.Parsers;
using PascalABCCompiler.Errors;
using System.Collections.Generic;
using GPPGParserScanner;
namespace PascalABCCompiler.Oberon00Parser
{
public class Oberon00LanguageInformation : DefaultLanguageInformation
{
public Oberon00LanguageInformation(IParser p):base(p)
{
}
protected override void InitKeywords()
{
List<string> keys = new List<string>();
List<string> type_keys = new List<string>();
keywords.Add("AND", "AND"); keys.Add("AND");
keywords.Add("OR", "OR"); keys.Add("OR");
keywords.Add("XOR", "XOR"); keys.Add("XOR");
keywords.Add("BEGIN", "BEGIN"); keys.Add("BEGIN");
keywords.Add("END", "END"); keys.Add("END");
keywords.Add("FOR", "FOR"); keys.Add("FOR");
keywords.Add("WHILE", "WHILE"); keys.Add("WHILE");
keywords.Add("DO", "DO"); keys.Add("DO");
keywords.Add("TO", "TO"); keys.Add("TO");
keywords.Add("ARRAY", "ARRAY"); keys.Add("ARRAY"); type_keys.Add("ARRAY");
keywords.Add("MODULE", "MODULE"); keys.Add("MODULE"); keyword_kinds.Add("MODULE", KeywordKind.Unit);
keywords.Add("VAR", "VAR"); keys.Add("VAR"); keyword_kinds.Add("VAR", KeywordKind.Var);
keywords.Add("CONST", "CONST"); keys.Add("CONST"); keyword_kinds.Add("CONST", KeywordKind.Const);
keywords.Add("IF", "IF"); keys.Add("IF");
keywords.Add("THEN", "THEN"); keys.Add("THEN");
keywords.Add("ELSE", "ELSE"); keys.Add("ELSE");
keywords_array = keys.ToArray();
type_keywords_array = type_keys.ToArray();
}
public override string SystemUnitName
{
get {
return "Oberon00System";
}
}
public override string BodyStartBracket
{
get
{
return "BEGIN";
}
}
public override string BodyEndBracket
{
get
{
return "END";
}
}
public override string ParameterDelimiter
{
get
{
return ";";
}
}
public override bool CaseSensitive
{
get
{
return true;
}
}
public override bool IncludeDotNetEntities
{
get
{
return false;
}
}
public override string GetDescriptionForModule(IInterfaceUnitScope scope)
{
return "Module " + scope.Name;
}
public override string GetStandardTypeByKeyword(KeywordKind keyw)
{
switch (keyw)
{
case KeywordKind.ByteType: return "BYTE";
case KeywordKind.IntType: return "INTEGER";
case KeywordKind.DoubleType: return "REAL";
case KeywordKind.CharType: return "CHAR";
case KeywordKind.BoolType: return "BOOLEAN";
}
return null;
}
protected override string GetSimpleDescriptionForElementScope(IElementScope scope)
{
string type_name = GetSimpleDescription(scope.Type);
if (type_name.StartsWith("$")) type_name = type_name.Substring(1, type_name.Length - 1);
return scope.Name + ": " + type_name;
}
private string kind_of_param(IElementScope scope)
{
/*switch (scope.ParamKind)
{
case PascalABCCompiler.SyntaxTree.parametr_kind.var_parametr: return "VAR ";
case PascalABCCompiler.SyntaxTree.parametr_kind.params_parametr: return "ParamArray ";
case PascalABCCompiler.SyntaxTree.parametr_kind.out_parametr: return "ByRef ";
}*/
return "";
}
protected override string GetDescriptionForElementScope(IElementScope scope)
{
string type_name = null;
StringBuilder sb = new StringBuilder();
if (scope.Type == null) type_name = "";
else
type_name = GetSimpleDescription(scope.Type);
if (type_name.StartsWith("$"))
type_name = type_name.Substring(1, type_name.Length - 1);
switch (scope.ElemKind)
{
case SymKind.Variable: sb.Append("VAR " + scope.Name + ": " + type_name); break;
case SymKind.Parameter: sb.Append(kind_of_param(scope) + "PARAMETER " + scope.Name + ": " + type_name); break;
case SymKind.Constant:
{
if (scope.ConstantValue == null)
sb.Append("CONST " + scope.Name + ": " + type_name);
else sb.Append("CONST " + scope.Name + " = " + scope.ConstantValue.ToString());
}
break;
}
return sb.ToString();
}
}
}