pascalabcnet/AdditionalLanguages/SPython/SPythonParserKrylovMovchan/SPythonParser.cs
Александр Земляк 17f6a9b956
Spython test suite (#3362)
* Reorganize files in TestSuite dir for multiple languages

* Add SPython samples to TestSuite

* Update TestRunner to support multiple languages

* Delete dll files accidentally pushed

* Update .gitignore

* Revert "Delete dll files accidentally pushed"

This reverts commit 62bcba2b821d58ae51ec98e9dadcf621bb0fc003.

* Update testing dir path in Testing.cs

* Improve TestRunner output

* Add random module and it's usage sample

* Reorganize gitignore files

* Move pascal tests back to TestSuite and create new TestSuiteLanguagePlugins folder for SPython

* Revert "Update testing dir path in Testing.cs"

This reverts commit 7d94eafb25292421bce8315520b4f6a0de001bbd.

* Revert crlf changes in pascal tests

* Test changes of _RebuildReleaseAndRunTestsForGitHubActions.bat

* Revert "Test changes of _RebuildReleaseAndRunTestsForGitHubActions.bat"

This reverts commit 234ceae3e3a339fbc68a6170e2bd201dab14d67d.

* Test changes in StorageLocationPicker

* Another test changes in StorageLocationPicker.cs

* Rename LanguagePlugins folder to AdditionalLanguages

* Decouple TestRunner from language names and parameters

* Revert calling TestRunner without parameters in .bat files

* Fix formatter tests nogui exception handling

* Small refactoring in Testing.cs and TestRunner fix of working directory
2025-12-21 21:11:52 +03:00

147 lines
4.5 KiB
C#

using System.IO;
using System.Collections.Generic;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.Parsers;
using SPythonParserYacc;
using PascalABCCompiler.SyntaxTreeConverters;
namespace SPythonParser
{
public class SPythonLanguageParser : BaseParser
{
public List<ISyntaxTreeConverter> SyntaxTreeConvertersForIntellisense { get; set; }
public override void Reset()
{
CompilerDirectives = new List<compiler_directive>();
Errors.Clear();
}
protected override void PreBuildTree(string FileName)
{
CompilerDirectives = new List<compiler_directive>();
}
protected override syntax_tree_node BuildTreeInNormalMode(string FileName, string Text, bool compilingNotMainProgram, List<string> DefinesList = null)
{
Errors.Clear();
Warnings.Clear();
syntax_tree_node root = Parse(Text, FileName, false, compilingNotMainProgram, DefinesList);
if (Errors.Count > 0)
return null;
if (root != null && root is compilation_unit)
(root as compilation_unit).file_name = FileName;
return root;
}
public syntax_tree_node Parse(string Text, string fileName, bool buildTreeForFormatter = false, bool compilingNotMainProgram = false, List<string> definesList = null)
{
#if DEBUG
#if _ERR
FileInfo f = new FileInfo(FileName);
var sv = Path.ChangeExtension(FileName,".grmtrack1");
var sw = new StreamWriter(sv);
Console.SetError(sw);
#endif
#endif
SPythonParserTools parserTools = new SPythonParserTools(Errors, Warnings, LanguageInformation.ValidDirectives, buildTreeForFormatter, false,
Path.GetFullPath(fileName), CompilerDirectives); // контекст сканера и парсера
IndentArranger ia = new IndentArranger();
ia.ProcessSourceText(ref Text);
var scanner = new Scanner(Text, parserTools, LanguageInformation.KeywordsStorage, definesList);
SPythonGPPGParser parser = new SPythonGPPGParser(scanner, parserTools, compilingNotMainProgram);
if (!parser.Parse())
if (Errors.Count == 0)
parserTools.AddErrorFromResource("UNEXPECTED_SYNTAX_ERROR", null);
#if DEBUG
#if _ERR
sw.Close();
#endif
#endif
return parser.root;
}
protected override syntax_tree_node BuildTreeInTypeExprMode(string FileName, string Text)
{
Text = string.Concat("<<type>>", Text);
var expr = Parse(Text, FileName) as expression;
if (expr == null)
return null;
foreach (ISyntaxTreeConverter converter in SyntaxTreeConvertersForIntellisense)
{
expr = (expression)converter.Convert(expr, true);
}
return expr;
}
protected override syntax_tree_node BuildTreeInExprMode(string FileName, string Text)
{
if (Text == string.Empty)
return null;
Text = string.Concat("<<expression>>", Text);
var expr = Parse(Text, FileName) as expression;
if (expr == null)
return null;
foreach (ISyntaxTreeConverter converter in SyntaxTreeConvertersForIntellisense)
{
expr = (expression)converter.Convert(expr, true);
}
return expr;
}
protected override syntax_tree_node BuildTreeInSpecialMode(string FileName, string Text, bool compilingNotMainProgram)
{
Errors.Clear();
return Parse(Text, FileName, compilingNotMainProgram);
}
protected override syntax_tree_node BuildTreeInFormatterMode(string FileName, string Text)
{
Errors.Clear();
return Parse(Text, FileName, true);
}
protected override syntax_tree_node BuildTreeInStatementMode(string FileName, string Text)
{
Text = string.Concat("<<statement>>", Text);
var st = Parse(Text, FileName) as statement;
if (st == null)
return null;
foreach (ISyntaxTreeConverter converter in SyntaxTreeConvertersForIntellisense)
{
st = (statement)converter.Convert(st, true);
}
return st;
}
}
}