Compare commits

...

65 次程式碼提交

作者 SHA1 備註 提交日期
  Theo Souchon c8897c4d3d Update ccmeta.leg 2 年之前
  Theo Souchon 30c5591bd6 tests dir 2 年之前
  Theo Souchon 6bd07a5d43 Update README.md 2 年之前
  Theo Souchon d5db1215d2 Update README.md 2 年之前
  Theo Souchon b5bf7d7d01 reorganisation 2 年之前
  Theo Souchon d1b31824f0 Change the parsimony library (1 TODO remaining) 2 年之前
  Theo Souchon b7501812c5 delete c file 2 年之前
  Theo Souchon 4af35d8b89 update parsimony library 2 年之前
  Theo Souchon bbfc2b5a03 test fix + add rules number 2 年之前
  Theo Souchon 4d4861a1a4 rm .out 2 年之前
  Theo Souchon 80a0bd9ea1 fix parsefrom 2 年之前
  Theo Souchon 2fdc3233dd Add comments to some functions and parsefrom fix (hack one) 2 年之前
  Theo Souchon aad9a759c6 Fix stack files 2 年之前
  Theo Souchon 5eb974e1ec Fixing println and other stuff 2 年之前
  Theo Souchon ab5b82a477 add ParseFrom test 2 年之前
  Theo Souchon 14d9f8fde5 Rearranging the repository, and improving the readme 2 年之前
  Theo Souchon 38b6693d23 Changing the readme 2 年之前
  Theo Souchon 28c32ae2db Update dynamicObject.mc 2 年之前
  Theo Souchon 6d0c45316d rm useless string() 2 年之前
  Theo Souchon 39dda7f39e Simplification of dynamicObject.mc 2 年之前
  Theo Souchon 0df1d03e90 Switch between C & Parsimony fix 2 年之前
  Theo Souchon 3693a7364f new test file and some advances in realObject 2 年之前
  Theo Souchon ad46f3fe61 Some corrections and comments 2 年之前
  Theo Souchon b4dbb6575c update on the automatic creation of an object 2 年之前
  Theo Souchon 3a5c167051 Fix code 2 年之前
  Theo Souchon 56474a8c61 Fixed some bugs and added comments 2 年之前
  Theo Souchon d204b3216d fake-static-classes fixed 2 年之前
  Theo Souchon d984397ce8 Simplification + functions without parenthesis 2 年之前
  Theo Souchon 881fe633e6 delete useless file 2 年之前
  Theo Souchon fa73f35010 full example for object 2 年之前
  Theo Souchon 1a6c7636b7 add object generator 2 年之前
  Theo Souchon 791119d516 modification for the class object 2 年之前
  Theo Souchon cc35616769 Simplification 2 年之前
  Theo Souchon 58b9f93c2c fix test program 2 年之前
  Theo Souchon df3cf0bb80 First working prototype for class creation 2 年之前
  Theo Souchon c95443c520 new example of simplification 2 年之前
  Sebeck10 0869f79f74 rm block in mvalue 2 年之前
  Sebeck10 30af3df993 re indenting the file 2 年之前
  Sebeck10 d63cda4774 Fix problem on C_stringLiteral for test 001 2 年之前
  Sebeck10 219ab49a7e Update map.c 2 年之前
  Sebeck10 137b55bfa0 Fix list creation in stmts 2 年之前
  Sebeck10 f4c6b57449 Fix file disposition 2 年之前
  Sebeck10 d09512529b Add boot file with usefull functions 2 年之前
  Sebeck10 eccdff7877 re-indentation of the file on the new rules 2 年之前
  Sebeck10 945cf11555 adds functions: map, guardmap, select, reject 2 年之前
  Sebeck10 699aeb00e1 Add beginning of select/reject 2 年之前
  Sebeck10 8ac6023ee0 Update map.c 2 年之前
  Sebeck10 2f4756a72c Fix map function/simplification of the language 2 年之前
  Sebeck10 985453defb add map function 2 年之前
  Sebeck10 98e97dfc4e simplification of the language 2 年之前
  Sebeck10 58ca592c31 Fix little problem on a rule 2 年之前
  Sebeck10 8532be1d4f append part almost done & beginning of map function 2 年之前
  Theo Souchon 99ed98b99a Fix the meta_block error 2 年之前
  Theo Souchon 5771673d02 Correct problem of return on 001.c test of parsimony folder 2 年之前
  Theo Souchon 55869205aa Added the ability to return more things in one language exchange 2 年之前
  Theo Souchon df08508ca5 variable "lang" removed from file and comments updated to avoid conflicts 2 年之前
  Theo Souchon 951b8078d6 remove test lang 2 年之前
  Theo Souchon 14b31fe6f0 Added some test files 2 年之前
  Theo Souchon 950d511a1a Total independence of parsimony 2 年之前
  Theo Souchon 1f09f074a1 Added constant, initializer and statement processing. 2 年之前
  Theo Souchon 5e24fc3153 Adding a rule to the file and correcting the meta2c example 2 年之前
  Theo Souchon b629909c78 Modification of the README.md 2 年之前
  Theo Souchon 621a7863cb Added some test files 2 年之前
  Theo Souchon e0d3e12df6 Reorganising and adding rules to the file 2 年之前
  Theo Souchon 58df8abff6 Adding flags for HOMEBREW and update of the gitignore 2 年之前
共有 354 個檔案被更改,包括 3074 行新增1039 行删除
分割檢視
  1. +7
    -0
      .gitignore
  2. +5
    -0
      AUTHORS
  3. +0
    -3
      README.md
  4. +1
    -0
      README.md
  5. +96
    -0
      doc/README.md
  6. 二進制
      doc/ccmeta.drawio.png
  7. +3
    -0
      examples/projectExample
  8. +19
    -0
      examples/projectExample.c
  9. +149
    -0
      examples/realObjectED
  10. +34
    -0
      examples/realObjectED.c
  11. +149
    -0
      examples/realObjectPF
  12. +34
    -0
      examples/realObjectPF.c
  13. +4
    -2
      src/Makefile
  14. +0
    -0
      src/buffer.h
  15. +0
    -0
      src/ccmeta-input.txt
  16. +1381
    -1029
      src/ccmeta.leg
  17. +0
    -0
      src/debug.c
  18. +12
    -0
      src/object.c
  19. +179
    -0
      src/parsimonyLibrary/boot.mc
  20. +134
    -0
      src/parsimonyLibrary/dynamicObject.c
  21. +233
    -0
      src/parsimonyLibrary/dynamicObjectExtDecl.mc
  22. +221
    -0
      src/parsimonyLibrary/dynamicObjectParsFrom.mc
  23. +118
    -0
      src/protoNumber.txt
  24. +0
    -0
      src/scope.c
  25. +0
    -0
      tests/c/00001.c
  26. +0
    -0
      tests/c/00002.c
  27. +0
    -0
      tests/c/00003.c
  28. +0
    -0
      tests/c/00004.c
  29. +0
    -0
      tests/c/00005.c
  30. +0
    -0
      tests/c/00006.c
  31. +0
    -0
      tests/c/00007.c
  32. +0
    -0
      tests/c/00008.c
  33. +0
    -0
      tests/c/00009.c
  34. +0
    -0
      tests/c/00010.c
  35. +0
    -0
      tests/c/00011.c
  36. +0
    -0
      tests/c/00012.c
  37. +0
    -0
      tests/c/00013.c
  38. +0
    -0
      tests/c/00014.c
  39. +0
    -0
      tests/c/00015.c
  40. +0
    -0
      tests/c/00016.c
  41. +0
    -0
      tests/c/00017.c
  42. +0
    -0
      tests/c/00018.c
  43. +0
    -0
      tests/c/00019.c
  44. +0
    -0
      tests/c/00020.c
  45. +0
    -0
      tests/c/00021.c
  46. +0
    -0
      tests/c/00022.c
  47. +0
    -0
      tests/c/00023.c
  48. +0
    -0
      tests/c/00024.c
  49. +0
    -0
      tests/c/00025.c
  50. +0
    -0
      tests/c/00026.c
  51. +0
    -0
      tests/c/00027.c
  52. +0
    -0
      tests/c/00028.c
  53. +0
    -0
      tests/c/00029.c
  54. +0
    -0
      tests/c/00030.c
  55. +0
    -0
      tests/c/00031.c
  56. +0
    -0
      tests/c/00032.c
  57. +0
    -0
      tests/c/00033.c
  58. +0
    -0
      tests/c/00034.c
  59. +0
    -0
      tests/c/00035.c
  60. +0
    -0
      tests/c/00036.c
  61. +0
    -0
      tests/c/00037.c
  62. +0
    -0
      tests/c/00038.c
  63. +0
    -0
      tests/c/00039.c
  64. +0
    -0
      tests/c/00040.c
  65. +0
    -0
      tests/c/00041.c
  66. +0
    -0
      tests/c/00042.c
  67. +0
    -0
      tests/c/00043.c
  68. +0
    -0
      tests/c/00044.c
  69. +0
    -0
      tests/c/00045.c
  70. +0
    -0
      tests/c/00046.c
  71. +0
    -0
      tests/c/00047.c
  72. +0
    -0
      tests/c/00048.c
  73. +0
    -0
      tests/c/00049.c
  74. +0
    -0
      tests/c/00050.c
  75. +0
    -0
      tests/c/00051.c
  76. +0
    -0
      tests/c/00052.c
  77. +0
    -0
      tests/c/00053.c
  78. +0
    -0
      tests/c/00054.c
  79. +0
    -0
      tests/c/00055.c
  80. +0
    -0
      tests/c/00056.c
  81. +0
    -0
      tests/c/00057.c
  82. +0
    -0
      tests/c/00058.c
  83. +0
    -0
      tests/c/00059.c
  84. +0
    -0
      tests/c/00060.c
  85. +0
    -0
      tests/c/00061.c
  86. +0
    -0
      tests/c/00064.c
  87. +0
    -0
      tests/c/00065.c
  88. +0
    -0
      tests/c/00072.c
  89. +0
    -0
      tests/c/00073.c
  90. +0
    -0
      tests/c/00075.c
  91. +0
    -0
      tests/c/00076.c
  92. +0
    -0
      tests/c/00077.c
  93. +0
    -0
      tests/c/00078.c
  94. +0
    -0
      tests/c/00079.c
  95. +0
    -0
      tests/c/00080.c
  96. +0
    -0
      tests/c/00081.c
  97. +0
    -0
      tests/c/00082.c
  98. +0
    -0
      tests/c/00083.c
  99. +0
    -0
      tests/c/00084.c
  100. +0
    -0
      tests/c/00085.c

+ 7
- 0
.gitignore 查看文件

@ -4,3 +4,10 @@
tests-c/*.otags
tests-c/*.tags
tests-c/*.expected
*.out
*tmp*
ccmeta
ccmeta.c
.vscode/

+ 5
- 0
AUTHORS 查看文件

@ -11,3 +11,8 @@ Mahe Tardy (2020)
Nathan Razafimanantsoa, Kumar Mahadayya (2021)
C AST
Theo Souchon (2022-2023)
metalanguage features, development, tests, examples
grammar, object system changes for metalanguage
source and repository reorganisation

+ 0
- 3
README.md 查看文件

@ -1,3 +0,0 @@
# ccmeta
C compiler with embedded metalanguage.

+ 1
- 0
README.md 查看文件

@ -0,0 +1 @@
doc/README.md

+ 96
- 0
doc/README.md 查看文件

@ -0,0 +1,96 @@
# CCMETA
C compiler with embedded metalanguage.
## <div id="toc">Table of contents<div>
1. [Architecture](#ar)
2. [Build the project](#bp)
- [Requirements](#ar)
- [Makefile](#makefile)
- [Build](#makefile_Build)
- [Clean](#makefile_Clean)
- [Test](#makefile_Test)
3. [Usage](#usage)
4. [Help](#help)
- [Peg/Leg](#pegleg)
5. [Authors](#authors)
## <div id="ar">Architecture<div>
![alt text](doc/ccmeta.drawio.png)
### [Go to the table of contents](#toc)
## <div id="bp">Build the project<div>
### <div id="req">Requirements<div>
Please install [peg/leg](https://www.piumarta.com/software/peg/) manually or with a package manager, for example with Homebrew:
```bash
$ brew install peg
```
Please install [the Boehm-Demers-Weiser conservative garbage collector](https://www.hboehm.info/gc/) manually or with a package manager, for example with Homebrew:
```bash
$ brew install bdw-gc
```
### <div id="makefile"> Makefile<div>
>Compatible with the homebrew installed on the apple silicon ship
#### <div id="makefile_Build">Build<div>
```bash
$ make
```
#### <div id="makefile_Clean">Clean<div>
```bash
$ make clean
```
#### <div id="makefile_Test">Test <div>
```bash
$ make test
```
### [Go to the table of contents](#toc)
## <div id="usage">Usage<div>
### How it works
You can pass your program:
* via an input file
```bash
$ ./ccmeta < file
```
* via a file
```bash
$ ./ccmeta file
```
### **Check each test file to get an idea of how parsimony works**
### [Go to the table of contents](#toc)
## <div id="help">Help<div>
### <div id="pegleg">peg/leg<div>
``` shell
$ man peg
```
### [Go to the table of contents](#toc)
## <div id="authors">Authors<div>
#### Ian Piumarta (2016-)
- infrastructure
- parsing framework
- C grammar, C AST
- object system design and implementation
- metalanguage design and implementation
#### Mahe Tardy (2020)
- object system implementation
- metalanguage implementation
#### Nathan Razafimanantsoa, Kumar Mahadayya (2021)
- C AST
#### Theo Souchon (2022-2023)
- metalanguage features, development, tests, examples
- grammar, object system changes for metalanguage
- source and repository reorganisation

二進制
doc/ccmeta.drawio.png 查看文件

Before After
Width: 692  |  Height: 293  |  Size: 14 KiB Width: 692  |  Height: 293  |  Size: 14 KiB

+ 3
- 0
examples/projectExample 查看文件

@ -0,0 +1,3 @@
enum foo { Closed = 0, ReadOnly = 1, WriteOnly = 2 };
static char *stateNames[] = { "Closed", "ReadOnly", "WriteOnly"};

+ 19
- 0
examples/projectExample.c 查看文件

@ -0,0 +1,19 @@
@{
mapast(f, seq)
{
out = {};
for (i in seq) {
e = seq[i];
out[length(out)] = e.__proto__ != Token ? f(e) : e ;
}
out;
}
idToString(x) { { __proto__: C_string, value: "\"" + string(x.name.identifier) + "\"" } }
nil;
}
enum foo { Closed = 0, ReadOnly = 1, WriteOnly = 2 };
static char *stateNames[] = { @(mapast(idToString, program.last.enumList)) };

+ 149
- 0
examples/realObjectED 查看文件

@ -0,0 +1,149 @@
// This example serves to illustrate the possibility
// of adding the object aspect to C
// using the everyExternalDeclaration function.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Symbol {
char *name;
int class, selector;
};
struct Symbol *newSymbol(char *name)
{
struct Symbol *symbol = malloc(sizeof(*symbol));
symbol->name = strdup(name);
symbol->class = 0;
symbol->selector = 0;
return symbol;
}
struct Symbol **symbols = 0;
int nSymbols = 0;
struct Symbol *intern(char *name)
{
int lo = 0;
int hi = nSymbols - 1;
while (lo <= hi ) {
int mid = (lo+hi)/2;
int cmp = strcmp(name, symbols[mid]->name);
if (cmp > 0) lo = mid + 1;
else if (cmp < 0) hi = mid - 1;
else return symbols[mid];
}
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols);
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1));
return symbols[lo] = newSymbol(name);
}
typedef void *(*method_t)();
void *method_dnu()
{
printf("method not found\n");
exit(1);
return 0;
}
method_t **methods = 0;
int nClasses = 0;
int nSelectors = 0;
int ensureClass(struct Symbol *symbol)
{
if (symbol->class == 0) {
if (nClasses == 0) nClasses++;
symbol->class = nClasses++;
methods = realloc(methods, sizeof(*methods)*nClasses);
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors);
for (int i = 0; i<nSelectors; ++i)
methods[symbol->class][i] = method_dnu;
}
return symbol->class;
}
int ensureSelector(struct Symbol *symbol)
{
if (symbol->selector == 0) {
if (nSelectors == 0) nSelectors++;
symbol->selector = nSelectors++;
for (int i = 0; i<nClasses; ++i) {
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors);
methods[i][nSelectors-1] = method_dnu;
}
}
return symbol->selector;
}
int findClass(char *class)
{
return ensureClass(intern(class));
}
int findSelector(char *selector)
{
return ensureSelector(intern(selector));
}
void addMethod(int class, int selector, method_t method)
{
methods[class][selector] = method;
}
#define lookup(C, S) (methods[C][S])
struct Object {
int class;
};
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); })
struct __oop { int class; };
typedef struct __oop *oop;
#include <math.h>
struct Point { int class; double x, y; };
oop newPoint(double x, double y)
{
struct Point *self = calloc(1, sizeof *self);
self->x = x;
self->y = y;
self->class = findClass("Point");
return (struct __oop *) self;
}
double Point_magnitude(struct __oop *__self)
{
struct Point *self = (struct Point *) __self;
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y));
return sqrt(self->x * self->x * self->y * self->y);
}
double Point_getX(struct __oop *__self)
{
struct Point *self = (struct Point *) __self;
printf("point method : %f\n", self->x);
return self->x;
}
int main()
{
int _selector_getX= findSelector("getX");
int _selector_magnitude= findSelector("magnitude");
int _class_Point= findClass("Point");
addMethod(_class_Point, _selector_getX, (method_t) Point_getX);
addMethod(_class_Point, _selector_magnitude, (method_t) Point_magnitude);
oop p = newPoint(3, 4);
send(p, magnitude);
send(p, getX);
return 0;
}

+ 34
- 0
examples/realObjectED.c 查看文件

@ -0,0 +1,34 @@
@import("parsimonyLibrary/dynamicObjectExtDecl.mc")
#include <math.h>
@class struct Point { double x, y; };
@constructor("Point") oop newPoint(double x, double y)
{
self->x = x;
self->y = y;
}
@method("Point") double magnitude()
{
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y));
return sqrt(self->x * self->x * self->y * self->y);
}
@method("Point") double getX()
{
printf("point method : %f\n", self->x);
return self->x;
}
int main()
{
oop p = newPoint(3, 4);
@send("p", "magnitude");
@send("p", "getX");
return 0;
}

+ 149
- 0
examples/realObjectPF 查看文件

@ -0,0 +1,149 @@
// This example serves to illustrate the possibility
// of adding the object aspect to C
// using the parseFrom primitive.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Symbol {
char *name;
int class, selector;
};
struct Symbol *newSymbol(char *name)
{
struct Symbol *symbol = malloc(sizeof(*symbol));
symbol->name = strdup(name);
symbol->class = 0;
symbol->selector = 0;
return symbol;
}
struct Symbol **symbols = 0;
int nSymbols = 0;
struct Symbol *intern(char *name)
{
int lo = 0;
int hi = nSymbols - 1;
while (lo <= hi ) {
int mid = (lo+hi)/2;
int cmp = strcmp(name, symbols[mid]->name);
if (cmp > 0) lo = mid + 1;
else if (cmp < 0) hi = mid - 1;
else return symbols[mid];
}
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols);
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1));
return symbols[lo] = newSymbol(name);
}
typedef void *(*method_t)();
void *method_dnu()
{
printf("method not found\n");
exit(1);
return 0;
}
method_t **methods = 0;
int nClasses = 0;
int nSelectors = 0;
int ensureClass(struct Symbol *symbol)
{
if (symbol->class == 0) {
if (nClasses == 0) nClasses++;
symbol->class = nClasses++;
methods = realloc(methods, sizeof(*methods)*nClasses);
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors);
for (int i = 0; i<nSelectors; ++i)
methods[symbol->class][i] = method_dnu;
}
return symbol->class;
}
int ensureSelector(struct Symbol *symbol)
{
if (symbol->selector == 0) {
if (nSelectors == 0) nSelectors++;
symbol->selector = nSelectors++;
for (int i = 0; i<nClasses; ++i) {
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors);
methods[i][nSelectors-1] = method_dnu;
}
}
return symbol->selector;
}
int findClass(char *class)
{
return ensureClass(intern(class));
}
int findSelector(char *selector)
{
return ensureSelector(intern(selector));
}
void addMethod(int class, int selector, method_t method)
{
methods[class][selector] = method;
}
#define lookup(C, S) (methods[C][S])
struct Object {
int class;
};
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); })
struct __oop { int class; };
typedef struct __oop *oop;
#include <math.h>
struct Point { int class; double x, y; };
oop newPoint(double x, double y)
{
struct Point *self = calloc(1, sizeof *self);
self->x = x;
self->y = y;
self->class = findClass("Point");
return (struct __oop *) self;
}
double Point_magnitude(struct __oop *__self)
{
struct Point *self = (struct Point *) __self;
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y));
return sqrt(self->x * self->x * self->y * self->y);
}
double Point_getX(struct __oop *__self)
{
struct Point *self = (struct Point *) __self;
printf("point method : %f\n", self->x);
return self->x;
}
int main()
{
int _selector_getX= findSelector("getX");
int _selector_magnitude= findSelector("magnitude");
int _class_Point= findClass("Point");
addMethod(_class_Point, _selector_getX, (method_t) Point_getX);
addMethod(_class_Point, _selector_magnitude, (method_t) Point_magnitude);
oop p = newPoint(3, 4);
// @send p magnitude();
// @send p getX();
return 0;
}

+ 34
- 0
examples/realObjectPF.c 查看文件

@ -0,0 +1,34 @@
@import("parsimonyLibrary/dynamicObjectParsFrom.mc")
#include <math.h>
@class struct Point { double x, y; };
@constructor Point oop newPoint(double x, double y)
{
self->x = x;
self->y = y;
}
@method Point double magnitude()
{
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y));
return sqrt(self->x * self->x * self->y * self->y);
}
@method Point double getX()
{
printf("point method : %f\n", self->x);
return self->x;
}
int main()
{
oop p = newPoint(3, 4);
// @send p magnitude();
// @send p getX();
return 0;
}

Makefile → src/Makefile 查看文件

@ -1,5 +1,5 @@
CFLAGS = -I/opt/local/include -std=gnu99 -Wall -Wno-unused-label -Wno-unused-function -g
LDLIBS = -L/opt/local/lib -lgc -lm
CFLAGS = -I/opt/local/include -I/opt/homebrew/include -std=gnu99 -Wall -Wno-unused-label -Wno-unused-function -g
LDLIBS = -L/opt/local/lib -L/opt/homebrew/lib -lgc -lm
TREE = -t
MAIN = ccmeta
@ -39,6 +39,8 @@ $(MAIN) : $(MAIN).c object.c buffer.h
clean : .FORCE
rm -f $(MAIN) $(MAIN).c
rm -f *~ $(MAIN)-output.out
rm -rf */*.out
rm -rf ccmeta.dSYM
tidy : .FORCE
rm -f *~ $(MAIN)-tree.out

buffer.h → src/buffer.h 查看文件


ccmeta-input.txt → src/ccmeta-input.txt 查看文件


src/ccmeta.leg
文件差異過大導致無法顯示
查看文件


debug.c → src/debug.c 查看文件


object.c → src/object.c 查看文件

@ -89,6 +89,7 @@ struct Undefined {
type_t type;
};
struct Integer {
type_t type;
int_t _value;
@ -427,6 +428,8 @@ int oopcmp(oop a, oop b)
}
case String:
return strcmp(get(a, String, value), get(b, String, value));
case Symbol:
return strcmp(get(a, Symbol, name), get(b, Symbol, name));
default: {
intptr_t l= (intptr_t)a, r= (intptr_t)b;
if (l < r) return -1;
@ -545,6 +548,15 @@ oop map_append(oop map, oop value)
return map_set(map, makeInteger(map_size(map)), value);
}
oop map_pop(oop map)
{ assert(map_isArray(map));
size_t size = get(map, Map, size);
if (size == 0) return null;
oop val = get(map, Map, elements)[--size].value;
set(map, Map, size, size);
return val;
}
oop makeArrayFromElement(oop elem, int repeat)
{
oop array= makeMapCapacity(repeat);

+ 179
- 0
src/parsimonyLibrary/boot.mc 查看文件

@ -0,0 +1,179 @@
@{
// create the function println
println(){
apply(print, __arguments__);
print("\n");
__arguments__;
}
__requires__ = {};
// Import the file
require(__fileName__)
{
if (__requires__[__fileName__] != null)
{
return __requires__[__fileName__]
}
import(__fileName__);
__requires__[__fileName__] = scope();
return scope();
}
// Get the current time in milliseconds
millis()
{
microseconds() / 1000;
}
// Get the last element of s
last(s)
{
s[length(s) - 1];
}
// adding the element e at the end of the list l
append(s, e)
{
s[length(s)] = e;
}
// adding the element e at the end of the list l
push(s, e)
{
append(s, e);
}
// remove the last element of the list s or remove the element e if not null
pop(s, e)
{
if (e == null)
{
e = length(s) - 1
}
ret = s[e];
t = {};
for (i in s)
{
if (i == e)
continue;
append(t, s[i]);
}
s = t;
ret;
}
// add or don't change an element in a dictionnary
intern(s, e)
{
lo = 0;
hi = length(s) - 1;
while (lo <= hi)
{
mid = (lo + hi) / 2;
if (e > s[mid])
lo = mid + 1;
else if (e < s[mid])
hi = mid - 1;
else
return e;
}
for (i = length(s); i > lo; i = i - 1)
{
s[i] = s[i - 1];
}
return s[lo] = e;
}
// merge the two list s1 and s2
fusion(s1, s2)
{
for (i in s2)
{
append(s1, s2[i]);
}
return s1;
}
// If g then we add a filter on the application of the function f to each element of seq
map(f, seq, g)
{
out = {};
if (!g) g = (){ 1 };
for (i in seq) {
e = seq[i];
out[length(out)] = g(e) ? f(e) : e ;
}
out;
}
notToken(x){x.__proto__ != Token}
// Select element e of s if the the result of the application of f on e is true
select(f, s)
{
out = {};
for (i in s)
{
e = s[i];
if (f(e))
{
append(out, e);
}
}
out;
}
// Select element e of s if the the result of the application of f on e is false
reject(f, s)
{
out = {};
for (i in s)
{
e = s[i];
if (!f(e))
{
append(out, e);
}
}
out;
}
//------------ C structure ------------//
newId(x, comm)
{
if (comm == null)
{
{identifier : x, __proto__ : C_id};
}
else
{
{identifier : x, comment : {text : comm, __proto__ : Comment}, __proto__ : C_id};
}
}
newText(x) { {value : x, __proto__ : C_string}; }
newComment(com) { {text : com, __proto__ : Comment}; }
newToken(txt, com)
{
if (com == null) return {text : txt, comment : newComment(""), __proto__ : Token};
{text : txt, comment : newComment(com), __proto__ : Token};
}
newSemicolon(com){newToken(";", com)}
newComma() { newToken(",", " "); }
newStar(com) { newToken("*", com); }
newBinary(com) { newToken("=", com); }
newEnum(x) { {attributeL : null, expression : null, name : newId(x), __proto__ : C_enum}; }
//-------------------- end ---------------------//
nil;
}

+ 134
- 0
src/parsimonyLibrary/dynamicObject.c 查看文件

@ -0,0 +1,134 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Symbol {
char *name;
int class, selector;
};
struct Symbol *newSymbol(char *name)
{
struct Symbol *symbol = malloc(sizeof(*symbol));
symbol->name = strdup(name);
symbol->class = 0;
symbol->selector = 0;
return symbol;
}
struct Symbol **symbols = 0;
int nSymbols = 0;
struct Symbol *intern(char *name)
{
int lo = 0;
int hi = nSymbols - 1;
while (lo <= hi ) {
int mid = (lo+hi)/2;
int cmp = strcmp(name, symbols[mid]->name);
if (cmp > 0) lo = mid + 1;
else if (cmp < 0) hi = mid - 1;
else return symbols[mid];
}
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols);
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1));
return symbols[lo] = newSymbol(name);
}
typedef void *(*method_t)();
void *method_dnu()
{
printf("method not found\n");
exit(1);
return 0;
}
method_t **methods = 0;
int nClasses = 0;
int nSelectors = 0;
int ensureClass(struct Symbol *symbol)
{
if (symbol->class == 0) {
if (nClasses == 0) nClasses++;
symbol->class = nClasses++;
methods = realloc(methods, sizeof(*methods)*nClasses);
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors);
for (int i = 0; i<nSelectors; ++i)
methods[symbol->class][i] = method_dnu;
}
return symbol->class;
}
int ensureSelector(struct Symbol *symbol)
{
if (symbol->selector == 0) {
if (nSelectors == 0) nSelectors++;
symbol->selector = nSelectors++;
for (int i = 0; i<nClasses; ++i) {
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors);
methods[i][nSelectors-1] = method_dnu;
}
}
return symbol->selector;
}
int findClass(char *class)
{
return ensureClass(intern(class));
}
int findSelector(char *selector)
{
return ensureSelector(intern(selector));
}
void addMethod(int class, int selector, method_t method)
{
methods[class][selector] = method;
}
#define lookup(C, S) (methods[C][S])
struct Object {
int class;
};
void *Object_print()
{
printf("Object\n");
return 0;
}
struct Point {
int class;
double x, y;
};
void *Point_print(struct Point *self)
{
printf("Point(%f, %f)\n", self->x, self->y);
return 0;
}
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); })
int main()
{
int _selector_print = findSelector("print" );
int _class_object = findClass ("Object" );
int _class_point = findClass ("Point" );
addMethod(_class_object, _selector_print, Object_print);
struct Object *o = calloc(1, sizeof(*o));
o->class = _class_object;
send(o, print);
addMethod(_class_point, _selector_print, Point_print);
struct Point *p = calloc(1, sizeof(*p));
p->class = _class_point;
send(p, print);
return 0;
}

+ 233
- 0
src/parsimonyLibrary/dynamicObjectExtDecl.mc 查看文件

@ -0,0 +1,233 @@
// This example serves to illustrate the possibility
// of adding the object aspect to C
// using the everyExternalDeclaration function.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Symbol {
char *name;
int class, selector;
};
struct Symbol *newSymbol(char *name)
{
struct Symbol *symbol = malloc(sizeof(*symbol));
symbol->name = strdup(name);
symbol->class = 0;
symbol->selector = 0;
return symbol;
}
struct Symbol **symbols = 0;
int nSymbols = 0;
struct Symbol *intern(char *name)
{
int lo = 0;
int hi = nSymbols - 1;
while (lo <= hi ) {
int mid = (lo+hi)/2;
int cmp = strcmp(name, symbols[mid]->name);
if (cmp > 0) lo = mid + 1;
else if (cmp < 0) hi = mid - 1;
else return symbols[mid];
}
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols);
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1));
return symbols[lo] = newSymbol(name);
}
typedef void *(*method_t)();
void *method_dnu()
{
printf("method not found\n");
exit(1);
return 0;
}
method_t **methods = 0;
int nClasses = 0;
int nSelectors = 0;
int ensureClass(struct Symbol *symbol)
{
if (symbol->class == 0) {
if (nClasses == 0) nClasses++;
symbol->class = nClasses++;
methods = realloc(methods, sizeof(*methods)*nClasses);
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors);
for (int i = 0; i<nSelectors; ++i)
methods[symbol->class][i] = method_dnu;
}
return symbol->class;
}
int ensureSelector(struct Symbol *symbol)
{
if (symbol->selector == 0) {
if (nSelectors == 0) nSelectors++;
symbol->selector = nSelectors++;
for (int i = 0; i<nClasses; ++i) {
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors);
methods[i][nSelectors-1] = method_dnu;
}
}
return symbol->selector;
}
int findClass(char *class)
{
return ensureClass(intern(class));
}
int findSelector(char *selector)
{
return ensureSelector(intern(selector));
}
void addMethod(int class, int selector, method_t method)
{
methods[class][selector] = method;
}
#define lookup(C, S) (methods[C][S])
struct Object {
int class;
};
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); })
struct __oop { int class; };
typedef struct __oop *oop;
@import("../src/parsimonyLibrary/boot.mc")
@{
rmSemi(x) {
x.semicolon = null;
x;
}
makeln(x, tabs, newLine) {
x.semicolon.comment = newComment("\n");
nbTabs = 0;
nbLn = 1;
if (tabs != null) { nbTabs = tabs; }
if (newLine != null) { nbLn = newLine; }
for (i = 1; i<nbLn; i++) {
x.semicolon.comment.text = x.semicolon.comment.text + "\n";
}
for (i = 0; i<tabs; i++) {
x.semicolon.comment.text = x.semicolon.comment.text + " ";
}
x;
}
program.objects = {};
program.objects.class = {};
program.objects.methods = {};
class()
{
program.objects.function = "class";
nil;
}
method(object_name)
{
program.objects.currentClassName = object_name;
program.objects.function = "method";
nil;
}
constructor(object_name) {
program.objects.currentClassName = object_name;
program.objects.function = "constructor";
nil;
}
send(object, method)
{
rmSemi(`declaration send(@@(newText(object)), @@(newText(method))););
}
everyExternalDeclaration(s)
{
/*********** Class function ************/
if (program.objects.function == "class") {
program.objects.class[program.last.name.identifier] = {};
for (i=length(program.last.declarationL); i>0; i--) {
program.last.declarationL[i] = program.last.declarationL[i-1];
};
program.last.declarationL[0] = `declaration int class; ;
program.objects.function = "none";
return s;
}
/*********** Method function ************/
if (program.objects.function == "method") {
intern(program.objects.methods, program.last.declarators.declarators.identifier);
for (i in program.objects.class) {
if (string(i) == program.objects.currentClassName) intern(program.objects.class[i], program.last.declarators.declarators.identifier);
}
program.last.declarators.declarators.identifier = program.objects.currentClassName + "_" + string(program.last.declarators.declarators.identifier);
param = rmSemi(`declaration struct __oop *__self;);
if (length(s.declarators.paramTypeL) > 0) {
append(s.declarators.paramTypeL, newComma());
append(s.declarators.paramTypeL, param);
} else {
s.declarators.paramTypeL = {};
s.declarators.paramTypeL[0] = param;
}
tmp = {};
tmp[0] = makeln(`declaration struct @@(newId(program.objects.currentClassName, " ")) *self = (struct @@(newId(program.objects.currentClassName, " ")) *) __self;, 1);
s.compoundS.expression = fusion(tmp, s.compoundS.expression);
program.objects.function = "none";
return s;
}
/*********** Constructor function ************/
if (program.objects.function == "constructor") {
rawDeclaration = makeln(`declaration class = findClass(@@(newText("\"" + program.objects.currentClassName + "\"")));, 1);
t = {};
append(t, makeln(`declaration struct @@(newId(program.objects.currentClassName, " ")) *self = calloc(1, sizeof *self);, 1));
// take the structure of self->foo
lhs = treeCopy(s.compoundS.expression[0].expression.lhs);
lhs.rhs = newId("class", " ");
// Change foo to Class
rawDeclaration.declarators[0].lhs = lhs;
// prepare the right object to return
append(s.compoundS.expression, rawDeclaration);
append(s.compoundS.expression, makeln(`statement return (struct __oop *) self;));
s.compoundS.expression = fusion(t, s.compoundS.expression);
program.objects.function = "none";
return s;
}
/*********** Main function ************/
if (s.declarators != null && s.declarators.declarators != null && string(s.declarators.declarators.identifier) == "main") {
t = {};
for(i in program.objects.methods) {
methodName = string(program.objects.methods[i]);
append(t, makeln(`declaration int @@(newId("_selector_" + methodName)) = findSelector(@@(newId("\"" + methodName + "\"")));, 1));
}
for (i in program.objects.class) {
className = string(i);
append(t, makeln(`declaration int @@(newId("_class_" + className)) = findClass(@@(newId("\"" + className + "\"")));, 1));
for (k in program.objects.class[i]) {
linkedMethod = string(program.objects.class[i][k]);
castMethod = "(method_t) " + className + "_" + linkedMethod;
append(t, makeln(`declaration addMethod(@@(newId("_class_" + className)), @@(newId("_selector_" + linkedMethod)), @@(newId(castMethod)));, 1));
}
}
s.compoundS.expression = fusion(t, s.compoundS.expression);
return s;
}
s;
}
nil;
}

+ 221
- 0
src/parsimonyLibrary/dynamicObjectParsFrom.mc 查看文件

@ -0,0 +1,221 @@
// This example serves to illustrate the possibility
// of adding the object aspect to C
// using the parseFrom primitive.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Symbol {
char *name;
int class, selector;
};
struct Symbol *newSymbol(char *name)
{
struct Symbol *symbol = malloc(sizeof(*symbol));
symbol->name = strdup(name);
symbol->class = 0;
symbol->selector = 0;
return symbol;
}
struct Symbol **symbols = 0;
int nSymbols = 0;
struct Symbol *intern(char *name)
{
int lo = 0;
int hi = nSymbols - 1;
while (lo <= hi ) {
int mid = (lo+hi)/2;
int cmp = strcmp(name, symbols[mid]->name);
if (cmp > 0) lo = mid + 1;
else if (cmp < 0) hi = mid - 1;
else return symbols[mid];
}
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols);
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1));
return symbols[lo] = newSymbol(name);
}
typedef void *(*method_t)();
void *method_dnu()
{
printf("method not found\n");
exit(1);
return 0;
}
method_t **methods = 0;
int nClasses = 0;
int nSelectors = 0;
int ensureClass(struct Symbol *symbol)
{
if (symbol->class == 0) {
if (nClasses == 0) nClasses++;
symbol->class = nClasses++;
methods = realloc(methods, sizeof(*methods)*nClasses);
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors);
for (int i = 0; i<nSelectors; ++i)
methods[symbol->class][i] = method_dnu;
}
return symbol->class;
}
int ensureSelector(struct Symbol *symbol)
{
if (symbol->selector == 0) {
if (nSelectors == 0) nSelectors++;
symbol->selector = nSelectors++;
for (int i = 0; i<nClasses; ++i) {
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors);
methods[i][nSelectors-1] = method_dnu;
}
}
return symbol->selector;
}
int findClass(char *class)
{
return ensureClass(intern(class));
}
int findSelector(char *selector)
{
return ensureSelector(intern(selector));
}
void addMethod(int class, int selector, method_t method)
{
methods[class][selector] = method;
}
#define lookup(C, S) (methods[C][S])
struct Object {
int class;
};
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); })
struct __oop { int class; };
typedef struct __oop *oop;
@import("../src/parsimonyLibrary/boot.mc")
@{
rmSemi(x) {
x.semicolon = null;
x;
}
makeln(x, tabs, newLine) {
x.semicolon.comment = newComment("\n");
nbTabs = 0;
nbLn = 1;
if (tabs != null) { nbTabs = tabs; }
if (newLine != null) { nbLn = newLine; }
for (i = 1; i<nbLn; i++) {
x.semicolon.comment.text = x.semicolon.comment.text + "\n";
}
for (i = 0; i<tabs; i++) {
x.semicolon.comment.text = x.semicolon.comment.text + " ";
}
x;
}
program.objects = {};
program.objects.class = {};
program.objects.methods = {};
class()
{
exp = parseFrom("declaration");
program.objects.class[exp.specifiers[0].name.identifier] = {};
for (i=length(exp.specifiers[0].declarationL); i>0; i--) {
exp.specifiers[0].declarationL[i] = exp.specifiers[0].declarationL[i-1];
};
exp.specifiers[0].declarationL[0] = `declaration int class; ;
exp;
}
method()
{
id = string(parseFrom("id").identifier);
decl = parseFrom("func");
intern(program.objects.methods, decl.declarators.declarators.identifier);
for (i in program.objects.class) {
if (string(i) == id) intern(program.objects.class[i], decl.declarators.declarators.identifier);
}
decl.declarators.declarators.identifier = id + "_" + string(decl.declarators.declarators.identifier);
param = rmSemi(`declaration struct __oop *__self;);
if (length(decl.declarators.paramTypeL) > 0) {
append(decl.declarators.paramTypeL, newComma());
append(decl.declarators.paramTypeL, param);
} else {
decl.declarators.paramTypeL = {};
decl.declarators.paramTypeL[0] = param;
}
tmp = {};
tmp[0] = makeln(`declaration struct @@(newId(id, " ")) *self = (struct @@(newId(id, " ")) *) __self;, 1);
decl.compoundS.expression = fusion(tmp, decl.compoundS.expression);
program.objects.function = "none";
decl;
}
constructor() {
id = string(parseFrom("id").identifier);
decl = parseFrom("func");
rawDeclaration = makeln(`declaration class = findClass(@@(newText("\"" + id + "\"")));, 1);
t = {};
append(t, makeln(`declaration struct @@(newId(id, " ")) *self = calloc(1, sizeof *self);, 1));
// take the structure of self->foo
lhs = treeCopy(decl.compoundS.expression[0].expression.lhs);
lhs.rhs = newId("class", " ");
// Change foo to Class
rawDeclaration.declarators[0].lhs = lhs;
// prepare the right object to return
append(decl.compoundS.expression, rawDeclaration);
append(decl.compoundS.expression, makeln(`statement return (struct __oop *) self;));
decl.compoundS.expression = fusion(t, decl.compoundS.expression);
program.objects.function = "none";
decl;
}
// TODO
send()
{
nil;
}
everyExternalDeclaration(s)
{
/*********** Main function ************/
if (s.declarators != null && s.declarators.declarators != null && string(s.declarators.declarators.identifier) == "main") {
t = {};
for(i in program.objects.methods) {
methodName = string(program.objects.methods[i]);
append(t, makeln(`declaration int @@(newId("_selector_" + methodName)) = findSelector(@@(newId("\"" + methodName + "\"")));, 1));
}
for (i in program.objects.class) {
className = string(i);
append(t, makeln(`declaration int @@(newId("_class_" + className)) = findClass(@@(newId("\"" + className + "\"")));, 1));
for (k in program.objects.class[i]) {
linkedMethod = string(program.objects.class[i][k]);
castMethod = "(method_t) " + className + "_" + linkedMethod;
append(t, makeln(`declaration addMethod(@@(newId("_class_" + className)), @@(newId("_selector_" + linkedMethod)), @@(newId(castMethod)));, 1));
}
}
s.compoundS.expression = fusion(t, s.compoundS.expression);
return s;
}
s;
}
nil;
}

+ 118
- 0
src/protoNumber.txt 查看文件

@ -0,0 +1,118 @@
_DO(Undefined)
_DO(Integer)
_DO(Float)
_DO(String)
_DO(Symbol)
_DO(Function)
_DO(Map)
_DO(If)
_DO(While)
_DO(Do)
_DO(For)
_DO(ForIn)
_DO(Switch)
_DO(Call)
_DO(Invoke)
_DO(Func)
_DO(Block)
_DO(Declaration)
_DO(Assign)
_DO(Logor)
_DO(Logand)
_DO(Bitor)
_DO(Bitxor)
_DO(Bitand)
_DO(Equal)
_DO(Noteq)
_DO(Less)
_DO(Lesseq)
_DO(Greater)
_DO(Greatereq)
_DO(Shleft)
_DO(Shright)
_DO(Add)
_DO(Sub)
_DO(Mul)
_DO(Div)
_DO(Mod)
_DO(Not)
_DO(Neg)
_DO(Com)
_DO(PreIncVariable)
_DO(PreIncMember)
_DO(PreIncIndex)
_DO(PostIncVariable)
_DO(PostIncMember)
_DO(PostIncIndex)
_DO(PreDecVariable)
_DO(PreDecMember)
_DO(PreDecIndex)
_DO(PostDecVariable)
_DO(PostDecMember)
_DO(PostDecIndex)
_DO(GetVariable)
_DO(GetMember)
_DO(SetMember)
_DO(GetIndex)
_DO(SetIndex)
_DO(Return)
_DO(Break)
_DO(Continue)
_DO(Throw)
_DO(Try)
_DO(Quote)
_DO(Quasiquote)
_DO(Comment)
_DO(Token)
_DO(C_declaration)
_DO(C_string)
_DO(C_if)
_DO(C_int)
_DO(C_float)
_DO(C_char)
_DO(C_id)
_DO(C_while)
_DO(C_do)
_DO(C_for)
_DO(C_binary)
_DO(C_initializer)
_DO(C_range)
_DO(C_conditional)
_DO(C_index)
_DO(C_designation)
_DO(C_attribution)
_DO(C_deref)
_DO(C_block)
_DO(C_call)
_DO(C_subexpr)
_DO(C_array)
_DO(C_parameter)
_DO(C_typeOf)
_DO(C_unary)
_DO(C_prefix)
_DO(C_alignOf)
_DO(C_sizeOf)
_DO(C_cast)
_DO(C_attributeSpec)
_DO(C_asm)
_DO(C_asmExpr)
_DO(C_asmExprArg)
_DO(C_aggregate)
_DO(C_attribute)
_DO(C_postfix)
_DO(C_compound)
_DO(C_functionDef)
_DO(C_exprStatement)
_DO(C_switch)
_DO(C_goto)
_DO(C_continue)
_DO(C_break)
_DO(C_return)
_DO(C_case)
_DO(C_default)
_DO(C_label)
_DO(C_labelDeclaration)
_DO(C_structSpec)
_DO(C_structDeclarator)
_DO(C_enumSpec)
_DO(C_enum)

scope.c → src/scope.c 查看文件


tests-c/00001.c → tests/c/00001.c 查看文件


tests-c/00002.c → tests/c/00002.c 查看文件


tests-c/00003.c → tests/c/00003.c 查看文件


tests-c/00004.c → tests/c/00004.c 查看文件


tests-c/00005.c → tests/c/00005.c 查看文件


tests-c/00006.c → tests/c/00006.c 查看文件


tests-c/00007.c → tests/c/00007.c 查看文件


tests-c/00008.c → tests/c/00008.c 查看文件


tests-c/00009.c → tests/c/00009.c 查看文件


tests-c/00010.c → tests/c/00010.c 查看文件


tests-c/00011.c → tests/c/00011.c 查看文件


tests-c/00012.c → tests/c/00012.c 查看文件


tests-c/00013.c → tests/c/00013.c 查看文件


tests-c/00014.c → tests/c/00014.c 查看文件


tests-c/00015.c → tests/c/00015.c 查看文件


tests-c/00016.c → tests/c/00016.c 查看文件


tests-c/00017.c → tests/c/00017.c 查看文件


tests-c/00018.c → tests/c/00018.c 查看文件


tests-c/00019.c → tests/c/00019.c 查看文件


tests-c/00020.c → tests/c/00020.c 查看文件


tests-c/00021.c → tests/c/00021.c 查看文件


tests-c/00022.c → tests/c/00022.c 查看文件


tests-c/00023.c → tests/c/00023.c 查看文件


tests-c/00024.c → tests/c/00024.c 查看文件


tests-c/00025.c → tests/c/00025.c 查看文件


tests-c/00026.c → tests/c/00026.c 查看文件


tests-c/00027.c → tests/c/00027.c 查看文件


tests-c/00028.c → tests/c/00028.c 查看文件


tests-c/00029.c → tests/c/00029.c 查看文件


tests-c/00030.c → tests/c/00030.c 查看文件


tests-c/00031.c → tests/c/00031.c 查看文件


tests-c/00032.c → tests/c/00032.c 查看文件


tests-c/00033.c → tests/c/00033.c 查看文件


tests-c/00034.c → tests/c/00034.c 查看文件


tests-c/00035.c → tests/c/00035.c 查看文件


tests-c/00036.c → tests/c/00036.c 查看文件


tests-c/00037.c → tests/c/00037.c 查看文件


tests-c/00038.c → tests/c/00038.c 查看文件


tests-c/00039.c → tests/c/00039.c 查看文件


tests-c/00040.c → tests/c/00040.c 查看文件


tests-c/00041.c → tests/c/00041.c 查看文件


tests-c/00042.c → tests/c/00042.c 查看文件


tests-c/00043.c → tests/c/00043.c 查看文件


tests-c/00044.c → tests/c/00044.c 查看文件


tests-c/00045.c → tests/c/00045.c 查看文件


tests-c/00046.c → tests/c/00046.c 查看文件


tests-c/00047.c → tests/c/00047.c 查看文件


tests-c/00048.c → tests/c/00048.c 查看文件


tests-c/00049.c → tests/c/00049.c 查看文件


tests-c/00050.c → tests/c/00050.c 查看文件


tests-c/00051.c → tests/c/00051.c 查看文件


tests-c/00052.c → tests/c/00052.c 查看文件


tests-c/00053.c → tests/c/00053.c 查看文件


tests-c/00054.c → tests/c/00054.c 查看文件


tests-c/00055.c → tests/c/00055.c 查看文件


tests-c/00056.c → tests/c/00056.c 查看文件


tests-c/00057.c → tests/c/00057.c 查看文件


tests-c/00058.c → tests/c/00058.c 查看文件


tests-c/00059.c → tests/c/00059.c 查看文件


tests-c/00060.c → tests/c/00060.c 查看文件


tests-c/00061.c → tests/c/00061.c 查看文件


tests-c/00064.c → tests/c/00064.c 查看文件


tests-c/00065.c → tests/c/00065.c 查看文件


tests-c/00072.c → tests/c/00072.c 查看文件


tests-c/00073.c → tests/c/00073.c 查看文件


tests-c/00075.c → tests/c/00075.c 查看文件


tests-c/00076.c → tests/c/00076.c 查看文件


tests-c/00077.c → tests/c/00077.c 查看文件


tests-c/00078.c → tests/c/00078.c 查看文件


tests-c/00079.c → tests/c/00079.c 查看文件


tests-c/00080.c → tests/c/00080.c 查看文件


tests-c/00081.c → tests/c/00081.c 查看文件


tests-c/00082.c → tests/c/00082.c 查看文件


tests-c/00083.c → tests/c/00083.c 查看文件


tests-c/00084.c → tests/c/00084.c 查看文件


tests-c/00085.c → tests/c/00085.c 查看文件


部分文件因文件數量過多而無法顯示

Loading…
取消
儲存