jamesalbert / HolyC-for-Linux

run HolyC on Linux secularly
MIT License
335 stars 18 forks source link
holyc linux lords-temple templeos terry-davis

HolyC-for-Linux

run HolyC on Linux secularly

Build Status License PyPI version

Disclaimer

This tool is in super-hella-mega alpha stage. If you use this, you will die. Or worse, your current operating system will be replaced with TempleOS. I've only tested this on 3.7-dev.

Install

pip install secularize

Translate

The primary use is to translate holyc to c. Do this with: secularize examples/test.hc

this turns examples/test.hc

F64 *s = 3;

U0 test(I16 a, U8 b, F64 c) {
  Print("hello");
}

F64 pest(I8 d) {
  Print("nothing");
}

Print("%s %s", "hello", "world");
I64 b = 2.000;

into examples/test.c

void test(short a, unsigned char b, double c)
{
  printf("hello");
}

double pest(char d)
{
  printf("nothing");
}

int main()
{
  double* s = 3;
  printf("%s %s", "hello", "world");
  long b = 2.0;
}

Debugging

To add a feature, it's useful to get the AST of an expected target. To do this, write the C file you're trying to translate to, then run secularize dump-ast name-of-file.c. This will pretty print the AST to json.

$ cat examples/math.c
int main()
{
  long a = 3;
  long b = 2;
}

$ secularize dump-ast examples/math.c
{
  "_nodetype": "FileAST",
  "coord": null,
  "ext": [
    {
      "_nodetype": "FuncDef",
      "coord": "examples/math.c:1:5",
      "decl": {
        "_nodetype": "Decl",
        "name": "main",
        "quals": [],
        "storage": [],
        "funcspec": [],
        "coord": "examples/math.c:1:5",
        "type": {
          "_nodetype": "FuncDecl",
          "coord": "examples/math.c:1:5",
          "type": {
            "_nodetype": "TypeDecl",
            "declname": "main",
            "quals": [],
            "coord": "examples/math.c:1:5",
            "type": {
              "_nodetype": "IdentifierType",
              "names": [
                "int"
              ],
              "coord": "examples/math.c:1:1"
            }
          },
          "args": null
        },
        "init": null,
        "bitsize": null
      },
      "body": {
        "_nodetype": "Compound",
        "coord": "examples/math.c:2:1",
        "block_items": [
          {
            "_nodetype": "Decl",
            "name": "a",
            "quals": [],
            "storage": [],
            "funcspec": [],
            "coord": "examples/math.c:3:8",
            "type": {
              "_nodetype": "TypeDecl",
              "declname": "a",
              "quals": [],
              "coord": "examples/math.c:3:8",
              "type": {
                "_nodetype": "IdentifierType",
                "names": [
                  "long"
                ],
                "coord": "examples/math.c:3:3"
              }
            },
            "init": {
              "_nodetype": "Constant",
              "type": "int",
              "value": "3",
              "coord": "examples/math.c:3:12"
            },
            "bitsize": null
          },
          {
            "_nodetype": "Decl",
            "name": "b",
            "quals": [],
            "storage": [],
            "funcspec": [],
            "coord": "examples/math.c:4:8",
            "type": {
              "_nodetype": "TypeDecl",
              "declname": "b",
              "quals": [],
              "coord": "examples/math.c:4:8",
              "type": {
                "_nodetype": "IdentifierType",
                "names": [
                  "long"
                ],
                "coord": "examples/math.c:4:3"
              }
            },
            "init": {
              "_nodetype": "Constant",
              "type": "int",
              "value": "2",
              "coord": "examples/math.c:4:12"
            },
            "bitsize": null
          }
        ]
      },
      "param_decls": null
    }
  ]
}

What's Supported

What's Not Supported

Everything else. Deal with it.