From 777f9ece1ae304a3b4c71de198ed1e0cefb3d75f Mon Sep 17 00:00:00 2001 From: marcheanin Date: Thu, 25 May 2023 12:25:44 +0300 Subject: [PATCH] add tabulation --- server/cmd/main.cpp | 10 ++- server/internal/metrics/include/DiffLib.h | 11 +-- server/internal/metrics/src/DiffLibImpl.cpp | 49 +++++++---- .../metrics/testProgs/output/out1.txt | 62 +++++++------- .../metrics/testProgs/output/out2.txt | 82 +++++++++---------- .../metrics/testProgs/output/test1.html | 80 +++++++++--------- .../metrics/testProgs/output/test2.html | 82 +++++++++---------- server/pkg/antlr/cpp14/include/MyCppAntlr.h | 1 + server/pkg/antlr/cpp14/src/MyCppAntlr.cpp | 16 ++++ .../pkg/antlr/python3/include/PythonAntlr.h | 1 + server/pkg/antlr/python3/src/PythonAntlr.cpp | 16 ++++ server/pkg/antlr/virtual/IAntlrWrapper.h | 1 + 12 files changed, 235 insertions(+), 176 deletions(-) diff --git a/server/cmd/main.cpp b/server/cmd/main.cpp index e277c3a..9a7c406 100644 --- a/server/cmd/main.cpp +++ b/server/cmd/main.cpp @@ -18,9 +18,15 @@ int main(int argc, const char* argv[]) { MyCppAntlr cppA1 = MyCppAntlr(fin3); MyCppAntlr cppA2 = MyCppAntlr(fin4); - std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); - std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); +// std::vector > str_int_tokens2 = cppA2.getTokensNamesWithPosition(); +// std::vector > str_int_tokens1 = cppA1.getTokensNamesWithPosition(); + std::vector > > str_int_tokens2 = cppA2.getTokensNamesWithFullPosition(); + std::vector > > str_int_tokens1 = cppA1.getTokensNamesWithFullPosition(); + + for (auto & i : str_int_tokens1){ + std::cout << i.first << " {" << i.second.first << " " << i.second.second << "}\n"; + } foundSame.setData(str_int_tokens1, str_int_tokens2); std::pair res = foundSame.getTexts(); diff --git a/server/internal/metrics/include/DiffLib.h b/server/internal/metrics/include/DiffLib.h index e1cf023..b24d973 100644 --- a/server/internal/metrics/include/DiffLib.h +++ b/server/internal/metrics/include/DiffLib.h @@ -15,18 +15,19 @@ class FoundSame { public: - void setData(std::vector > _tokens1, std::vector > _tokens2); + void setData(std::vector > > _tokens1, + std::vector > > _tokens2); [[maybe_unused]] std::pair getTexts(); private: struct Elem2 { std::string op; // 1 - Insert, 2 - Delete, 3 - Copy, 4 - Replace - std::pair token1; - std::pair token2; + std::pair > token1; + std::pair > token2; }; - std::vector > str_int_tokens1; - std::vector > str_int_tokens2; + std::vector > > str_int_tokens1; + std::vector > > str_int_tokens2; std::vector res_alignment; std::pair tokens2text(); diff --git a/server/internal/metrics/src/DiffLibImpl.cpp b/server/internal/metrics/src/DiffLibImpl.cpp index 8b2febb..95f027b 100644 --- a/server/internal/metrics/src/DiffLibImpl.cpp +++ b/server/internal/metrics/src/DiffLibImpl.cpp @@ -5,7 +5,8 @@ #include "DiffLib.h" -void FoundSame::setData(std::vector > _tokens1, std::vector > _tokens2) { +void FoundSame::setData(std::vector > > _tokens1, + std::vector > > _tokens2) { str_int_tokens1 = std::move(_tokens2); str_int_tokens2 = std::move(_tokens1); } @@ -33,7 +34,7 @@ std::pair FoundSame::getTexts() { cache[0][i] = {"D", str_int_tokens2[i-1], {"#", str_int_tokens2[i-1].second}}; //аналогично } - std::pair r, h; + std::pair > r, h; for (size_t i = 1; i <= n; i++){ for (size_t j = 1; j <= m; j++){ h = str_int_tokens1[i-1], r = str_int_tokens2[j-1]; @@ -90,11 +91,11 @@ std::pair FoundSame::tokens2text() { std::string res1, res2; std::vector ops; - int line = res_alignment[0].token1.second; + int line = res_alignment[0].token1.second.first; for (auto & i : res_alignment){ - if (i.token1.second > line){ - while(line != i.token1.second){ + if (i.token1.second.first > line){ + while(line != i.token1.second.first){ res1 += '\n'; line++; } @@ -102,13 +103,13 @@ std::pair FoundSame::tokens2text() { res1 += i.token1.first, res1 += " "; } - line = res_alignment[0].token2.second; + line = res_alignment[0].token2.second.first; for (auto & i : res_alignment){ - if (i.token2.second > line){ + if (i.token2.second.first > line){ res2 += '\t'; //outOps(ops, res2); ops.clear(); - while(line < i.token2.second){ + while(line < i.token2.second.first){ res2+= '\n'; line++; } @@ -167,12 +168,12 @@ std::pair FoundSame::tokens2html() { if (i.token1.first == "%") { i.token1.first = ""; - i.token1.second = -1; + i.token1.second.first = -1; } if (i.token2.first == "#") { i.token2.first = ""; - i.token2.second = -1; + i.token2.second.first = -1; } } @@ -182,38 +183,54 @@ std::pair FoundSame::tokens2html() { std::string res2 = res1; std::vector ops; - int line = res_alignment[0].token1.second; + int line = res_alignment[0].token1.second.first; + + int f = 0; for (auto & i : res_alignment){ - if (i.token1.second > line){ - while(line != i.token1.second){ + if (i.token1.second.first > line){ + while(line < i.token1.second.first){ res1 += "
"; res1 += '\n'; line++; } + f = 1; } if (i.op == "I") res1 += teg_I; if (i.op == "D") res1 += teg_D; if (i.op == "C") res1 += teg_C; if (i.op == "R") res1 += teg_R; + if (f == 1){ + for (int k = 0; k < i.token1.second.second; k++){ + res1 += " "; + } + f = 0; + } res1 += i.token1.first; if (!i.token1.first.empty()) res1 += " "; res1 += close_teg; } - line = res_alignment[0].token2.second; + line = res_alignment[0].token2.second.first; for (auto & i : res_alignment){ - if (i.token2.second > line){ - while(line < i.token2.second){ + if (i.token2.second.first > line){ + while(line < i.token2.second.first){ res2 += "
"; res2+= '\n'; line++; } + f = 1; } if (i.op == "I") res2 += teg_I; if (i.op == "D") res2 += teg_D; if (i.op == "C") res2 += teg_C; if (i.op == "R") res2 += teg_R; + if (f == 1){ + for (int k = 0; k < i.token2.second.second; k++){ + res2 += " "; + } + f = 0; + } res2 += i.token2.first; if (!i.token2.first.empty()) res2 += " "; res2 += close_teg; diff --git a/server/internal/metrics/testProgs/output/out1.txt b/server/internal/metrics/testProgs/output/out1.txt index c8da48c..f56b87c 100644 --- a/server/internal/metrics/testProgs/output/out1.txt +++ b/server/internal/metrics/testProgs/output/out1.txt @@ -6,39 +6,39 @@ using namespace std ;

bool check ( vector < int > s , int i , int j ) {
-for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
-if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
-return 0 ;
-}
-}
-return 1 ;
+    for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+        if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+            return 0 ;
+        }
+    }
+    return 1 ;
}

int main ( ) {
-long long n ;
-cin > > n ;
-vector < int > s ;
-for ( int i = 1 ; i <= n ; i ++ ) {
-if ( n i == 0 ) {
-s . push_back ( i ) ;
-}
-}
-vector < pair < int , int > > ans ;
-for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
-if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
-ans . push_back ( { s [ i ] , s [ j ] } ) ;
-}
-}
-}
-cout < < "graph {" < < endl ;
-for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
-cout < < s [ i ] < < endl ;
-}
+    long long n ;
+    cin > > n ;
+    vector < int > s ;
+    for ( int i = 1 ; i <= n ; i ++ ) {
+        if ( n i == 0 ) {
+            s . push_back ( i ) ;
+        }
+    }
+    vector < pair < int , int > > ans ;
+    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+        for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+            if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+                ans . push_back ( { s [ i ] , s [ j ] } ) ;
+            }
+        }
+    }
+    cout < < "graph {" < < endl ;
+    for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+        cout < < s [ i ] < < endl ;
+    }

-for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
-cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
-}
-cout < < "}" ;
-} <EOF> +    for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+        cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+    }
+    cout < < "}" ;
+} <EOF> \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/out2.txt b/server/internal/metrics/testProgs/output/out2.txt index cbc62ed..a8bd122 100644 --- a/server/internal/metrics/testProgs/output/out2.txt +++ b/server/internal/metrics/testProgs/output/out2.txt @@ -1,48 +1,48 @@ -
#include <iostream>
-#include <vector>
-#include<algorithm>
-#include<cmath>
-usingnamespacestd;
-constintinf=1e9;
+
#include <iostream>
+#include <vector>
+#include<algorithm>
+#include<cmath>
+using namespace std ;
+const int inf = 1e9 ;


-intmain(){
-intn,s,f;
-cin>>n>>s>>f;
-s--;f--;
-vector<int>d(n,inf),p(n);
-vector<int>u(n);
-vector<vector<pair<int,int>>>g(n);
-for(inti=0;i<n;i++){
-for(intj=0;j<n;j++){
-intq;
-scanf("%d",&q);
-if(i>0){
+int main ( ) {
+    int n , s , f ;
+    cin > > n > > s > > f ;
+    s -- ; f -- ;
+    vector < int > d ( n , inf ) , p ( n ) ;
+    vector < int > u ( n ) ;
+    vector < vector < pair < int , int > > > g ( n ) ;
+    for ( int i = 0 ; i < n ; i ++ ) {
+        for ( int j = 0 ; j < n ; j ++ ) {
+            int q ;
+            scanf ( "%d" , & q ) ;
+            if ( i > 0 ) {

-}
-}
-}
-d[s]=0;
-for(inti=0;i<n;++i){
-intv=-1;
-for(intj=0;j<n;++j)
-if(!u[j]&&(v==-1||d[j]<d[v]))
-v=j;
-if(d[v]==inf)break;
-u[v]=true;
-for(autoj:g[v]){
-intto=j.first;
-intlen=j.second;
-if(d[v]+len<d[to]){
-d[to]=d[v]+len;
-p[to]=v;
-}
-}
+            }
+        }
+    }
+    d [ s ] = 0 ;
+    for ( int i = 0 ; i < n ; ++ i ) {
+        int v = - 1 ;
+        for ( int j = 0 ; j < n ; ++ j )
+            if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
+        v = j ;
+        if ( d [ v ] == inf ) break ;
+        u [ v ] = true ;
+        for ( auto j : g [ v ] ) {
+            int to = j . first ;
+            int len = j . second ;
+            if ( d [ v ] + len < d [ to ] ) {
+                d [ to ] = d [ v ] + len ;
+                p [ to ] = v ;
+            }
+        }

-}
-cout<<(d[f]==inf?-1:d[f])<<endl;
-return0;
-}<EOF>
+    }
+    cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
+    return 0 ;
+} <EOF>
\ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test1.html b/server/internal/metrics/testProgs/output/test1.html index fe1e712..8218676 100644 --- a/server/internal/metrics/testProgs/output/test1.html +++ b/server/internal/metrics/testProgs/output/test1.html @@ -2,45 +2,45 @@
#include <iostream>
- #include <vector> + #include <vector>
-
- using namespace std ;
-
- bool check ( vector < int > s , int i , int j ) {
- for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
- if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
- return 0 ;
- }
- }
- return 1 ;
- }
-
- int main ( ) {
- long long n ;
- cin > > n ;
- vector < int > s ;
- for ( int i = 1 ; i <= n ; i ++ ) {
- if ( n i == 0 ) {
- s . push_back ( i ) ;
- }
- }
- vector < pair < int , int > > ans ;
- for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
- for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
- if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
- ans . push_back ( { s [ i ] , s [ j ] } ) ;
- }
- }
- }
- cout < < "graph {" < < endl ;
- for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
- cout < < s [ i ] < < endl ;
- }
-
- for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
- cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
- }
- cout < < "}" ;
- } <EOF>
+
+ using namespace std ;
+
+ bool check ( vector < int > s , int i , int j ) {
+     for ( int k = 0 ; k < s . size ( ) ; k ++ ) {
+         if ( s [ k ] != i && s [ k ] != j && s [ k ] i == 0 && j s [ k ] == 0 ) {
+             return 0 ;
+         }
+     }
+     return 1 ;
+ }
+
+ int main ( ) {
+     long long n ;
+     cin > > n ;
+     vector < int > s ;
+     for ( int i = 1 ; i <= n ; i ++ ) {
+         if ( n i == 0 ) {
+             s . push_back ( i ) ;
+         }
+     }
+     vector < pair < int , int > > ans ;
+     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+         for ( int j = i + 1 ; j < s . size ( ) ; j ++ ) {
+             if ( s [ j ] s [ i ] == 0 && check ( s , s [ i ] , s [ j ] ) ) {
+                 ans . push_back ( { s [ i ] , s [ j ] } ) ;
+             }
+         }
+     }
+     cout < < "graph {" < < endl ;
+     for ( int i = 0 ; i < s . size ( ) ; i ++ ) {
+         cout < < s [ i ] < < endl ;
+     }
+
+     for ( int i = 0 ; i < ans . size ( ) ; i ++ ) {
+         cout < < ans [ i ] . first < < "--" < < ans [ i ] . second < < endl ;
+     }
+     cout < < "}" ;
+ } <EOF> \ No newline at end of file diff --git a/server/internal/metrics/testProgs/output/test2.html b/server/internal/metrics/testProgs/output/test2.html index 796c668..1d4bf8c 100644 --- a/server/internal/metrics/testProgs/output/test2.html +++ b/server/internal/metrics/testProgs/output/test2.html @@ -1,52 +1,52 @@
#include <iostream> -
+
#include <vector> -
+
#include<algorithm> -
+
#include<cmath> -
- usingnamespacestd;
- constintinf=1e9;
+
+ using namespace std ;
+ const int inf = 1e9 ;


- intmain(){
- intn,s,f;
- cin>>n>>s>>f;
- s--;f--;
- vector<int>d(n,inf),p(n);
- vector<int>u(n);
- vector<vector<pair<int,int>>>g(n);
- for(inti=0;i<n;i++){
- for(intj=0;j<n;j++){
- intq;
- scanf("%d",&q);
- if(i>0){
+ int main ( ) {
+     int n , s , f ;
+     cin > > n > > s > > f ;
+     s -- ; f -- ;
+     vector < int > d ( n , inf ) , p ( n ) ;
+     vector < int > u ( n ) ;
+     vector < vector < pair < int , int > > > g ( n ) ;
+     for ( int i = 0 ; i < n ; i ++ ) {
+         for ( int j = 0 ; j < n ; j ++ ) {
+             int q ;
+             scanf ( "%d" , & q ) ;
+             if ( i > 0 ) {

- }
- }
- }
- d[s]=0;
- for(inti=0;i<n;++i){
- intv=-1;
- for(intj=0;j<n;++j)
- if(!u[j]&&(v==-1||d[j]<d[v]))
- v=j;
- if(d[v]==inf)break;
- u[v]=true;
- for(autoj:g[v]){
- intto=j.first;
- intlen=j.second;
- if(d[v]+len<d[to]){
- d[to]=d[v]+len;
- p[to]=v;
- }
- }
+             }
+         }
+     }
+     d [ s ] = 0 ;
+     for ( int i = 0 ; i < n ; ++ i ) {
+         int v = - 1 ;
+         for ( int j = 0 ; j < n ; ++ j )
+             if ( ! u [ j ] && ( v == - 1 || d [ j ] < d [ v ] ) )
+         v = j ;
+         if ( d [ v ] == inf ) break ;
+         u [ v ] = true ;
+         for ( auto j : g [ v ] ) {
+             int to = j . first ;
+             int len = j . second ;
+             if ( d [ v ] + len < d [ to ] ) {
+                 d [ to ] = d [ v ] + len ;
+                 p [ to ] = v ;
+             }
+         }

- }
- cout<<(d[f]==inf?-1:d[f])<<endl;
- return0;
- }<EOF>
+     }
+     cout < < ( d [ f ] == inf ? - 1 : d [ f ] ) < < endl ;
+     return 0 ;
+ } <EOF> \ No newline at end of file diff --git a/server/pkg/antlr/cpp14/include/MyCppAntlr.h b/server/pkg/antlr/cpp14/include/MyCppAntlr.h index 9df34a5..1794eb0 100644 --- a/server/pkg/antlr/cpp14/include/MyCppAntlr.h +++ b/server/pkg/antlr/cpp14/include/MyCppAntlr.h @@ -22,6 +22,7 @@ class MyCppAntlr:public IAntlrWrapper { std::vector getTokensTypes() override; std::vector getTokensNames() override; std::vector> getTokensNamesWithPosition() override; + std::vector > > getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp index f80d1c1..1dd13e6 100644 --- a/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp +++ b/server/pkg/antlr/cpp14/src/MyCppAntlr.cpp @@ -37,6 +37,22 @@ std::vector> MyCppAntlr::getTokensNamesWithPosition( return ans; } +std::vector > > MyCppAntlr::getTokensNamesWithFullPosition(){ + tokenStream_ptr->fill(); + std::vector > > ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = static_cast (token->getLine()); + int pos = static_cast (token->getCharPositionInLine()); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector MyCppAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); diff --git a/server/pkg/antlr/python3/include/PythonAntlr.h b/server/pkg/antlr/python3/include/PythonAntlr.h index 615d432..047f96b 100644 --- a/server/pkg/antlr/python3/include/PythonAntlr.h +++ b/server/pkg/antlr/python3/include/PythonAntlr.h @@ -23,6 +23,7 @@ class PythonAntlr:public IAntlrWrapper { std::vector getTokensTypes() override; std::vector getTokensNames() override; std::vector> getTokensNamesWithPosition() override; + std::vector > > getTokensNamesWithFullPosition() override; std::pair getTokensAndTree() override; std::string getTokensString() override; std::string getTreeString() override; diff --git a/server/pkg/antlr/python3/src/PythonAntlr.cpp b/server/pkg/antlr/python3/src/PythonAntlr.cpp index b7c83b4..44aa199 100644 --- a/server/pkg/antlr/python3/src/PythonAntlr.cpp +++ b/server/pkg/antlr/python3/src/PythonAntlr.cpp @@ -37,6 +37,22 @@ std::vector> PythonAntlr::getTokensNamesWithPosition return ans; } +std::vector > > PythonAntlr::getTokensNamesWithFullPosition(){ + tokenStream_ptr->fill(); + std::vector > > ans(tokenStream_ptr->size()); + + size_t i = 0; + for (antlr4::Token *token : tokenStream_ptr->getTokens()) { + auto type = token->getText(); + int line = token->getLine(); + int pos = token->getCharPositionInLine(); + ans[i] = std::make_pair(type, std::make_pair(line, pos)); + i++; + } + + return ans; +} + std::vector PythonAntlr::getTokensTypes() { tokenStream_ptr->fill(); std::vector ans(tokenStream_ptr->size()); diff --git a/server/pkg/antlr/virtual/IAntlrWrapper.h b/server/pkg/antlr/virtual/IAntlrWrapper.h index 718a017..c4452fe 100644 --- a/server/pkg/antlr/virtual/IAntlrWrapper.h +++ b/server/pkg/antlr/virtual/IAntlrWrapper.h @@ -12,6 +12,7 @@ class IAntlrWrapper { virtual std::vector getTokensTypes() = 0; virtual std::vector getTokensNames() = 0; virtual std::vector> getTokensNamesWithPosition() = 0; + virtual std::vector > > getTokensNamesWithFullPosition() = 0; virtual std::pair getTokensAndTree() = 0; virtual std::string getTokensString() = 0; virtual std::string getTreeString() = 0; -- GitLab