That is simple parser of C language code. which work in valid C code. And generates a syntax tree to find the expression result.
Here are some examples to give an idea of what kind of results this tool produces.
C code which define some simple statement, such as variable declaration and display some text etc.
C Code
#include <stdio.h>
int main()
{
// Main logic here
int a = 0;
int b = a + 10;
printf("%d", b);
return 0;
}
Result
{ "source": [ { "fundecl": { "name": "main", "param": [], "kind": 4, "type": "int", "signed": false, "body": [ { "compound": [ { "comment": [ "// Main logic here" ] }, { "decl": { "name": "a", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "constant", "value": 0, "type": "int" } ] } }, { "decl": { "name": "b", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "a", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "+", "right": { "exp": [ { "0": "constant", "value": 10.3, "type": "double" } ], "kind": 8, "type": "double", "signed": false }, "kind": 8, "type": "double", "signed": false } ] } }, { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": "%d", "type": "string" } ], [ { "0": "identifier", "name": "b", "kind": 4, "type": "int", "signed": false } ] ] }, [ "return", [ { "0": "constant", "value": 0, "type": "int" } ] ] ] } ] } }, [ "include", [ "stdio.h" ] ], [ "localfun", [ "main" ] ] ] }
C code
/*
C program for
Insert linked list node at beginning of linked list
*/
#include <stdio.h>
#include <stdlib.h>
// Linked List LinkNode
struct LinkNode
{
int data;
struct LinkNode *next;
};
// Singly linked list
struct SingleLL
{
struct LinkNode *head;
};
// Returns the new linked list
struct SingleLL *newLinkedList()
{
// Create memory of head and tail Nodes
struct SingleLL *sll = (struct SingleLL *)
malloc(sizeof(struct SingleLL));
if (sll == NULL)
{
printf("Memory overflow\n");
}
else
{
sll->head = NULL;
}
return sll;
}
// Handles the request of adding new node at beginning of linked list
void addNode(struct SingleLL *sll, int data)
{
// Create dynamic node
struct LinkNode *node = (struct LinkNode *)
malloc(sizeof(struct LinkNode));
if (node == NULL)
{
printf("Memory overflow to Create LinkNode\n");
return;
}
else
{
// Set initial node value
node->data = data;
node->next = sll->head;
}
sll->head = node;
}
// Display linked list element
void display(struct LinkNode *node)
{
if (node == NULL)
{
return;
}
struct LinkNode *temp = node;
// iterating linked list elements
while (temp != NULL)
{
printf(" %d →", temp->data);
// Visit to next node
temp = temp->next;
}
printf(" NULL\n");
}
int main()
{
struct SingleLL *sll = newLinkedList();
// Linked list
// 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → NULL
addNode(sll, 8);
addNode(sll, 7);
addNode(sll, 6);
addNode(sll, 5);
addNode(sll, 4);
addNode(sll, 3);
addNode(sll, 2);
addNode(sll, 1);
printf(" Linked List \n");
display(sll->head);
return 0;
}
Result
{ "source": [ { "struct": { "name": "LinkNode", "fields": [ { "name": "data", "kind": 4, "type": "int", "signed": false }, { "name": "next", "kind": 12, "type": "LinkNode", "ptr": "*" } ] } }, { "comment": [ "// Singly linked list" ] }, { "struct": { "name": "SingleLL", "fields": [ { "name": "head", "kind": 12, "type": "LinkNode", "ptr": "*" } ] } }, { "comment": [ "// Returns the new linked list" ] }, { "fundecl": { "name": "newLinkedList", "param": [], "kind": 12, "type": "SingleLL", "ptr": "*", "body": [ { "comment": [ "// Create memory of head and tail Nodes", "// Handles the request of adding new node at beginning of linked list" ] }, { "compound": [ { "decl": { "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*", "init": true, "assing": [ { "0": "cast", "type": "SingleLL", "kind": 12, "ptr": "*", "operand": { "0": "funcall", "name": "malloc", "kind": 12, "type": "void", "ptr": "*", "param": [ [ { "0": "constant", "value": 8, "type": "long" } ] ] } } ] } }, { "if": { "cond": [ { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], "kind": 12, "type": "SingleLL", "ptr": "*" }, "op": "==", "right": { "exp": [ { "0": "cast", "type": "void", "kind": 12, "ptr": "*", "operand": { "0": "constant", "value": 0, "type": "int" } } ], "kind": 12, "type": "void", "ptr": "*" }, "kind": 4, "type": "int", "signed": false } ], "body": [ { "compound": [ { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": "Memory overflow\n", "type": "string" } ] ] } ] } ] } }, { "else": [ { "compound": [ { "0": "assing_var", "left": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], "field": { "name": "head", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "=", "right": { "exp": [ { "0": "cast", "type": "void", "kind": 12, "ptr": "*", "operand": { "0": "constant", "value": 0, "type": "int" } } ], "kind": 12, "type": "void", "ptr": "*" }, "kind": 12, "type": "LinkNode", "ptr": "*" } ] } ] }, [ "return", [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ] ] ] } ] } }, { "fundecl": { "name": "addNode", "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "identifier", "name": "data", "kind": 4, "type": "int", "signed": false } ] ], "kind": 0, "type": "void", "signed": false, "body": [ { "comment": [ "// Create dynamic node", "// Set initial node value", "// Display linked list element" ] }, { "compound": [ { "decl": { "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*", "init": true, "assing": [ { "0": "cast", "type": "LinkNode", "kind": 12, "ptr": "*", "operand": { "0": "funcall", "name": "malloc", "kind": 12, "type": "void", "ptr": "*", "param": [ [ { "0": "constant", "value": 16, "type": "long" } ] ] } } ] } }, { "if": { "cond": [ { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "==", "right": { "exp": [ { "0": "cast", "type": "void", "kind": 12, "ptr": "*", "operand": { "0": "constant", "value": 0, "type": "int" } } ], "kind": 12, "type": "void", "ptr": "*" }, "kind": 4, "type": "int", "signed": false } ], "body": [ { "compound": [ { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": "Memory overflow to Create LinkNode\n", "type": "string" } ] ] }, [ "return", [] ] ] } ] } }, { "else": [ { "compound": [ { "0": "assing_var", "left": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "field": { "name": "data", "kind": 4, "type": "int", "signed": false } } } ], "kind": 4, "type": "int", "signed": false }, "op": "=", "right": { "exp": [ { "0": "identifier", "name": "data", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, { "0": "assing_var", "left": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "field": { "name": "next", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "=", "right": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], "field": { "name": "head", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "kind": 12, "type": "LinkNode", "ptr": "*" } ] } ] }, { "0": "assing_var", "left": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], "field": { "name": "head", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "=", "right": { "exp": [ { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "kind": 12, "type": "LinkNode", "ptr": "*" } ] } ] } }, { "fundecl": { "name": "display", "param": [ [ { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ] ], "kind": 0, "type": "void", "signed": false, "body": [ { "comment": [ "// iterating linked list elements", "// Visit to next node" ] }, { "compound": [ { "if": { "cond": [ { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "==", "right": { "exp": [ { "0": "cast", "type": "void", "kind": 12, "ptr": "*", "operand": { "0": "constant", "value": 0, "type": "int" } } ], "kind": 12, "type": "void", "ptr": "*" }, "kind": 4, "type": "int", "signed": false } ], "body": [ { "compound": [ [ "return", [] ] ] } ] } }, { "decl": { "name": "temp", "kind": 12, "type": "LinkNode", "ptr": "*", "init": true, "assing": [ { "0": "identifier", "name": "node", "kind": 12, "type": "LinkNode", "ptr": "*" } ] } }, { "compound": [ { "0": "while", "cond": [ { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "temp", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "!=", "right": { "exp": [ { "0": "cast", "type": "void", "kind": 12, "ptr": "*", "operand": { "0": "constant", "value": 0, "type": "int" } } ], "kind": 12, "type": "void", "ptr": "*" } } ], "body": [ { "compound": [ { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": " %d →", "type": "string" } ], [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "temp", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "field": { "name": "data", "kind": 4, "type": "int", "signed": false } } } ] ] }, { "0": "assing_var", "left": { "exp": [ { "0": "identifier", "name": "temp", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "op": "=", "right": { "exp": [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "temp", "kind": 12, "type": "LinkNode", "ptr": "*" } ], "field": { "name": "next", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ], "kind": 12, "type": "LinkNode", "ptr": "*" }, "kind": 12, "type": "LinkNode", "ptr": "*" } ] } ] } ] }, { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": " NULL\n", "type": "string" } ] ] } ] } ] } }, { "fundecl": { "name": "main", "param": [], "kind": 4, "type": "int", "signed": false, "body": [ { "compound": [ { "decl": { "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*", "init": true, "assing": [ { "0": "funcall", "name": "newLinkedList", "kind": 12, "type": "SingleLL", "ptr": "*", "param": [] } ] } }, { "comment": [ "// Linked list", "// 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → NULL" ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 8, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 7, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 6, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 5, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 4, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 3, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 2, "type": "int" } ] ] }, { "0": "funcall", "name": "addNode", "kind": 0, "type": "void", "signed": false, "param": [ [ { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], [ { "0": "constant", "value": 1, "type": "int" } ] ] }, { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": " Linked List \n", "type": "string" } ] ] }, { "0": "funcall", "name": "display", "kind": 0, "type": "void", "signed": false, "param": [ [ { "ref": { "select": [ { "deref": "*" }, { "0": "identifier", "name": "sll", "kind": 12, "type": "SingleLL", "ptr": "*" } ], "field": { "name": "head", "kind": 12, "type": "LinkNode", "ptr": "*" } } } ] ] }, [ "return", [ { "0": "constant", "value": 0, "type": "int" } ] ] ] } ] } }, [ "include", [ "stdlib.h", "stdio.h" ] ], [ "localfun", [ "main", "display", "addNode", "newLinkedList" ] ] ] }
C code
#include <stdio.h>
void main()
{
int a = 10;
int b = 20;
int c = (a > b) ? a + 2 : b + 5;
int d = (c > 2) ? ((c > b) ? c - 3 : c + 3) : 100;
// 25
printf("%d\n", c);
// 22
printf("%d\n", d);
}
Result
{ "source": [ { "fundecl": { "name": "main", "param": [], "kind": 0, "type": "void", "signed": false, "body": [ { "compound": [ { "decl": { "name": "a", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "constant", "value": 10, "type": "int" } ] } }, { "decl": { "name": "b", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "constant", "value": 20, "type": "int" } ] } }, { "decl": { "name": "c", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "ternary", "cond": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "b", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "<", "right": { "exp": [ { "0": "identifier", "name": "a", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, "then": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "a", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "+", "right": { "exp": [ { "0": "constant", "value": 2, "type": "int" } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, "else": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "b", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "+", "right": { "exp": [ { "0": "constant", "value": 5, "type": "int" } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false } } ] } }, { "decl": { "name": "d", "kind": 4, "type": "int", "signed": false, "init": true, "assing": [ { "0": "ternary", "cond": { "0": "binary", "left": { "exp": [ { "0": "constant", "value": 2, "type": "int" } ], "kind": 4, "type": "int", "signed": false }, "op": "<", "right": { "exp": [ { "0": "identifier", "name": "c", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, "then": { "0": "ternary", "cond": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "b", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "<", "right": { "exp": [ { "0": "identifier", "name": "c", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, "then": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "c", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "-", "right": { "exp": [ { "0": "constant", "value": 3, "type": "int" } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false }, "else": { "0": "binary", "left": { "exp": [ { "0": "identifier", "name": "c", "kind": 4, "type": "int", "signed": false } ], "kind": 4, "type": "int", "signed": false }, "op": "+", "right": { "exp": [ { "0": "constant", "value": 3, "type": "int" } ], "kind": 4, "type": "int", "signed": false }, "kind": 4, "type": "int", "signed": false } }, "else": { "0": "constant", "value": 100, "type": "int" } } ] } }, { "comment": [ "// 25" ] }, { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": "%d\n", "type": "string" } ], [ { "0": "identifier", "name": "c", "kind": 4, "type": "int", "signed": false } ] ] }, { "comment": [ "// 22" ] }, { "0": "funcall", "name": "printf", "kind": 4, "type": "int", "signed": false, "param": [ [ { "0": "constant", "value": "%d\n", "type": "string" } ], [ { "0": "identifier", "name": "d", "kind": 4, "type": "int", "signed": false } ] ] } ] } ] } }, [ "include", [ "stdio.h" ] ], [ "localfun", [ "main" ] ] ] }
C code
#include<stdio.h>
int main()
{
int one_d[] = {1,2,4};
int two_d[][3] = {{1,2,4},{3,4,6}};
return 0;
}
Result
{ "source": [ { "fundecl": { "name": "main", "param": [], "kind": 4, "type": "int", "signed": false, "body": [ { "compound": [ { "decl": { "name": "one_d", "kind": 10, "dim": [ { "0": "index", "value": 3 } ], "type": "int", "bits": 12, "init": true, "assing": [ { "0": "array_init", "element": [ [ { "0": "constant", "value": 1, "type": "int" } ], [ { "0": "constant", "value": 2, "type": "int" } ], [ { "0": "constant", "value": 4, "type": "int" } ] ] } ] } }, { "decl": { "name": "two_d", "kind": 10, "dim": [ { "0": "index", "value": 2 }, { "0": "index", "value": 3 } ], "type": "int", "bits": 24, "init": true, "assing": [ { "0": "array_init", "element": [ [ { "0": "array_init", "element": [ [ { "0": "constant", "value": 1, "type": "int" } ], [ { "0": "constant", "value": 2, "type": "int" } ], [ { "0": "constant", "value": 4, "type": "int" } ] ] } ], [ { "0": "array_init", "element": [ [ { "0": "constant", "value": 3, "type": "int" } ], [ { "0": "constant", "value": 4, "type": "int" } ], [ { "0": "constant", "value": 6, "type": "int" } ] ] } ] ] } ] } }, [ "return", [ { "0": "constant", "value": 0, "type": "int" } ] ] ] } ] } }, [ "include", [ "stdio.h" ] ], [ "localfun", [ "main" ] ] ] }
("bits" / sizeof(array element)) provides the size of array.
Note : This tool are designed to parse c code statically. It is in its infancy and does not provide 100% accuracy guarantee.
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment