Compare commits

..

3 Commits

Author SHA1 Message Date
c6bed88d37
Add test for basic custom struct 2023-08-28 22:15:10 +08:00
3640da1cf2
format main.cpp 2023-08-28 22:11:02 +08:00
3148127319
update code format configure 2023-08-28 21:58:23 +08:00
3 changed files with 870 additions and 846 deletions

View File

@ -1,5 +1,5 @@
Language: Cpp Language: Cpp
AccessModifierOffset: -4 AccessModifierOffset: -8
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignArrayOfStructures: Left AlignArrayOfStructures: Left
AlignConsecutiveMacros: None AlignConsecutiveMacros: None
@ -56,8 +56,8 @@ BreakStringLiterals: true
ColumnLimit: 99 ColumnLimit: 99
QualifierAlignment: Left QualifierAlignment: Left
CompactNamespaces: false CompactNamespaces: false
ConstructorInitializerIndentWidth: 4 ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 4 ContinuationIndentWidth: 8
Cpp11BracedListStyle: true Cpp11BracedListStyle: true
DeriveLineEnding: true DeriveLineEnding: true
DerivePointerAlignment: false DerivePointerAlignment: false
@ -79,7 +79,7 @@ IndentGotoLabels: false
IndentPPDirectives: None IndentPPDirectives: None
IndentExternBlock: AfterExternBlock IndentExternBlock: AfterExternBlock
IndentRequires: false IndentRequires: false
IndentWidth: 4 IndentWidth: 8
IndentWrappedFunctionNames: false IndentWrappedFunctionNames: false
InsertTrailingCommas: Wrapped InsertTrailingCommas: Wrapped
InsertBraces: true InsertBraces: true
@ -141,7 +141,7 @@ SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both BitFieldColonSpacing: Both
Standard: Cpp11 Standard: Cpp11
TabWidth: 4 TabWidth: 8
UseCRLF: false UseCRLF: false
UseTab: Always UseTab: Always

View File

@ -1,16 +1,16 @@
#include <bits/stdc++.h>
#include <argparse/argparse.hpp> #include <argparse/argparse.hpp>
#include <bits/stdc++.h>
using namespace std; using namespace std;
enum class TokenType { enum class TokenType {
COMMA, // , COMMA, // ,
SEMI, // ; SEMI, // ;
LB, LB, // {
RB, RB, // }
LP, LP, // (
RP, RP, // )
LT, LT, // <
RT, // { } ( ) < > RT, // >
ASSIGN, // = ASSIGN, // =
DOT, // . DOT, // .
COLON, // : COLON, // :
@ -21,7 +21,8 @@ enum class TokenType {
RETURN, // return RETURN, // return
TYPEOF, // typeof TYPEOF, // typeof
PUBLIC, // public PUBLIC, // public
ID ID, // identifier
EXCEED
}; };
struct Token { struct Token {
@ -55,7 +56,8 @@ void printTokens() {
"public", "public",
"ID"}; "ID"};
for (auto u : tokens) { for (auto u : tokens) {
cout << mp[static_cast<int>(u.type)] << " " << u.line << " " << cvt.to_bytes(u.s) << endl; cout << mp[static_cast<int>(u.type)] << " " << u.line << " " << cvt.to_bytes(u.s)
<< endl;
} }
cout << endl; cout << endl;
} }
@ -191,7 +193,8 @@ bool sameType(shared_ptr<ValType> a, shared_ptr<ValType> b) {
return false; return false;
} }
if (a->type() == 0) { if (a->type() == 0) {
auto aa = static_pointer_cast<TemplateType>(a), bb = static_pointer_cast<TemplateType>(b); auto aa = static_pointer_cast<TemplateType>(a),
bb = static_pointer_cast<TemplateType>(b);
return aa == bb || eq.find({aa, bb}) != eq.end(); return aa == bb || eq.find({aa, bb}) != eq.end();
} }
if (a->type() == 1) { if (a->type() == 1) {
@ -201,7 +204,8 @@ bool sameType(shared_ptr<ValType> a, shared_ptr<ValType> b) {
return false; return false;
} }
assert(aa->mp.size() == bb->mp.size()); assert(aa->mp.size() == bb->mp.size());
for (auto ia = aa->mp.begin(), ib = bb->mp.begin(); ia != aa->mp.end(); ia++, ib++) { for (auto ia = aa->mp.begin(), ib = bb->mp.begin(); ia != aa->mp.end();
ia++, ib++) {
assert(ia->first == ib->first); assert(ia->first == ib->first);
if (!sameType(ia->second, ib->second)) { if (!sameType(ia->second, ib->second)) {
return false; return false;
@ -323,7 +327,8 @@ shared_ptr<ValType> struct_replace(shared_ptr<ValType> vt, shared_ptr<StructType
for (auto u = vtt->str; u.get() != nullptr; u = u->fa.lock()) { for (auto u = vtt->str; u.get() != nullptr; u = u->fa.lock()) {
vis.insert(u); vis.insert(u);
} }
for (auto u = ut->str; u.get() != nullptr && vis.find(u) == vis.end(); u = u->fa.lock()) { for (auto u = ut->str; u.get() != nullptr && vis.find(u) == vis.end();
u = u->fa.lock()) {
for (auto tem : u->c1) { for (auto tem : u->c1) {
tt->mp.erase(tem); tt->mp.erase(tem);
} }
@ -507,7 +512,8 @@ shared_ptr<ValType> createVal() {
bool legal = vals.size() == tt->str->c2.size(); bool legal = vals.size() == tt->str->c2.size();
if (legal) { if (legal) {
for (size_t i = 0; i < vals.size(); i++) { for (size_t i = 0; i < vals.size(); i++) {
if (!sameType(vals[i], struct_replace(tt->str->c2[i], tt))) { if (!sameType(vals[i],
struct_replace(tt->str->c2[i], tt))) {
legal = 0; legal = 0;
break; break;
} }
@ -818,8 +824,10 @@ void work() {
} }
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
argparse::ArgumentParser program("acpa", APP_VERSION argparse::ArgumentParser program("acpa",
, argparse::default_arguments::help, false); APP_VERSION,
argparse::default_arguments::help,
false);
program.add_argument("input_file") program.add_argument("input_file")
.help("Source proof file") .help("Source proof file")
.action([](const std::string& value) { return value; }); .action([](const std::string& value) { return value; });

16
tests/ok/custom-struct.ac Normal file
View File

@ -0,0 +1,16 @@
struct {
struct And<P, Q>(p: P, q: Q) {
left = Fn<>() -> P {
return p;
};
right = Fn<>() -> Q {
return q;
};
};
AndLeft = Fn<P, Q>(h: And<P, Q>) -> P {
return h.p;
};
} main;