From 5742d02dc61a1cabc3bc3efd2feb8c81931ff814 Mon Sep 17 00:00:00 2001 From: MinyazevR Date: Fri, 17 Dec 2021 11:26:54 +0300 Subject: [PATCH 1/2] writing a function to check a string and writing tests --- .../lexicalAnalysis/lexicalAnalysis.sln" | 31 ++++ .../lexicalAnalysis/LexicalAnalysis.c" | 107 ++++++++++++ .../lexicalAnalysis/LexicalAnalysis.h" | 4 + .../lexicalAnalysis/lexicalAnalysis/Main.c" | 30 ++++ .../lexicalAnalysis/ReadString.c" | 37 +++++ .../lexicalAnalysis/ReadString.h" | 3 + .../lexicalAnalysis/TestLexicalAnalysis.c" | 18 ++ .../lexicalAnalysis/TestLexicalAnalysis.h" | 4 + .../lexicalAnalysis/lexicalAnalysis.vcxproj" | 155 ++++++++++++++++++ .../lexicalAnalysis.vcxproj.filters" | 42 +++++ 10 files changed, 431 insertions(+) create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis.sln" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.c" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/Main.c" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.c" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.c" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj" create mode 100644 "Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj.filters" diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis.sln" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis.sln" new file mode 100644 index 0000000..2ecbf78 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis.sln" @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31410.357 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lexicalAnalysis", "lexicalAnalysis\lexicalAnalysis.vcxproj", "{4C58C0AB-268F-4588-8690-F3B9D99B950C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Debug|x64.ActiveCfg = Debug|x64 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Debug|x64.Build.0 = Debug|x64 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Debug|x86.ActiveCfg = Debug|Win32 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Debug|x86.Build.0 = Debug|Win32 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Release|x64.ActiveCfg = Release|x64 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Release|x64.Build.0 = Release|x64 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Release|x86.ActiveCfg = Release|Win32 + {4C58C0AB-268F-4588-8690-F3B9D99B950C}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C864152D-6DC5-4FB3-B326-DBAFFAE504BB} + EndGlobalSection +EndGlobal diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.c" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.c" new file mode 100644 index 0000000..e894a8c --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.c" @@ -0,0 +1,107 @@ +#include "LexicalAnalysis.h" +#include + +bool isDigit(char symbol) +{ + return symbol <= '9' && symbol >= '0'; +} + +bool checkExpression(char* string) +{ + const int lenghtString = strlen(string); + int state = 0; + for (int i = 0; i < lenghtString + 1; i++) + { + switch (state) + { + case 0 : + { + if (isDigit(string[i])) + { + state = 1; + break; + } + return false; + } + case 1: + { + if (isDigit(string[i])) + { + break; + } + if (string[i] == '\0') + { + return true; + } + if (string[i] == '.') + { + state = 2; + break; + } + return false; + } + case 2: + { + if (isDigit(string[i])) + { + state = 3; + break; + } + return false; + } + case 3: + { + if (isDigit(string[i])) + { + break; + } + if (string[i] == '\0') + { + return true; + } + if (string[i] == 'E') + { + state = 4; + break; + } + return false; + } + case 4: + { + if(isDigit(string[i])) + { + state = 6; + break; + } + if (string[i] == '+' || string[i] == '-') + { + state = 5; + break; + } + return false; + } + case 5: + { + if (isDigit(string[i])) + { + state = 6; + break; + } + return false; + } + case 6: + { + if (isDigit(string[i])) + { + break; + } + if (string[i] == '\0') + { + return true; + } + return false; + } + } + } + return false; +} \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" new file mode 100644 index 0000000..3d637dc --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" @@ -0,0 +1,4 @@ +#pragma once +#include + +bool checkExpression(char* string); \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/Main.c" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/Main.c" new file mode 100644 index 0000000..2aa89a8 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/Main.c" @@ -0,0 +1,30 @@ +#include "TestLexicalAnalysis.h" +#include +#include "ReadString.h" +#include "LexicalAnalysis.h" +#include + +int main() +{ + if (!testCheckTestExpression()) + { + printf("Test failed"); + return -1; + } + printf("enter the string\n"); + int error = 0; + char* string = readString(&error); + if (error == 1) + { + printf("failed to enter string\n"); + return -1; + } + bool result = checkExpression(string); + free(string); + if (!result) + { + printf("the entered string is not a real number\n"); + return -1; + } + printf("the entered string is a real number\n"); +} \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.c" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.c" new file mode 100644 index 0000000..1c3e0c9 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.c" @@ -0,0 +1,37 @@ +#include "ReadString.h" +#include +#include +#include + +char* readString(int* error) +{ + int index = 0; + int size = 100; + char* array = calloc(size, sizeof(char)); + if (array == NULL) + { + *error = 1; + return NULL; + } + char symbol = getchar(); + while (symbol != '\n') + { + array[index] = symbol; + if (strlen(array) == size) + { + size = size * 2; + char* temporary = realloc(array, size * sizeof(char)); + if (temporary == NULL) + { + *error = 1; + free(array); + return NULL; + } + array = temporary; + } + symbol = getchar(); + index++; + } + array[index] = '\0'; + return array; +} \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" new file mode 100644 index 0000000..2dd4d97 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" @@ -0,0 +1,3 @@ +#pragma once + +char* readString(int* error); \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.c" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.c" new file mode 100644 index 0000000..26ed0bc --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.c" @@ -0,0 +1,18 @@ +#include "TestLexicalAnalysis.h" +#include "LexicalAnalysis.h" + +bool testCheckTestExpression() +{ + bool firstResult = checkExpression("3"); + bool secondResult = checkExpression("3.734432"); + bool thirdResult = checkExpression("33412.253253"); + bool fourthResult = checkExpression("234.2424E-10"); + bool fifthResult = checkExpression("3.0001E+10"); + bool sixthResult = checkExpression("3."); + bool seventhResult = checkExpression("3.E"); + bool eighthResult = checkExpression("3324.23455E+"); + bool ninthResult = checkExpression(""); + bool tenthResult = checkExpression("3E-1111.1221"); + return firstResult && secondResult && thirdResult && fourthResult && fifthResult + && !sixthResult && !seventhResult && !eighthResult && !ninthResult && !tenthResult; +} \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" new file mode 100644 index 0000000..d6ac841 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" @@ -0,0 +1,4 @@ +#pragma once +#include + +bool testCheckTestExpression(); \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj" new file mode 100644 index 0000000..8be65cb --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj" @@ -0,0 +1,155 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {4c58c0ab-268f-4588-8690-f3b9d99b950c} + lexicalAnalysis + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj.filters" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj.filters" new file mode 100644 index 0000000..2749f91 --- /dev/null +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/lexicalAnalysis.vcxproj.filters" @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Исходные файлы + + + Исходные файлы + + + Исходные файлы + + + Исходные файлы + + + + + Файлы заголовков + + + Файлы заголовков + + + Файлы заголовков + + + \ No newline at end of file From 234663687006e9cc4feac29f806e08cbfe20e192 Mon Sep 17 00:00:00 2001 From: MinyazevR Date: Fri, 17 Dec 2021 11:29:50 +0300 Subject: [PATCH 2/2] added comments to functions --- .../lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" | 1 + .../lexicalAnalysis/lexicalAnalysis/ReadString.h" | 1 + .../lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" | 1 + 3 files changed, 3 insertions(+) diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" index 3d637dc..3b3acc5 100644 --- "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/LexicalAnalysis.h" @@ -1,4 +1,5 @@ #pragma once #include +// Function to check whether an expression is a real number bool checkExpression(char* string); \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" index 2dd4d97..ef41005 100644 --- "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/ReadString.h" @@ -1,3 +1,4 @@ #pragma once +// Function for entering a line with memory allocation (for entering a line of arbitrary size) char* readString(int* error); \ No newline at end of file diff --git "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" index d6ac841..ccfb10f 100644 --- "a/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" +++ "b/Homework\342\204\22612/lexicalAnalysis/lexicalAnalysis/TestLexicalAnalysis.h" @@ -1,4 +1,5 @@ #pragma once #include +// Function for testing the defining function is and the string is a real number bool testCheckTestExpression(); \ No newline at end of file