src/ast/README
A Yacc/Bison AST library
This directory contains the implementation of an Abstract Syntax Tree (AST) library which can be used to generate and manipulate a tree representation of a code described by a Yacc/Bison context-free grammar.
Within Basilisk, it is used by qcc to parse Basilisk C code and transform it into standard C99.
The main files are:
- basilisk.yacc: Basilisk C yacc grammar.
- tokens.lex: the corresponding Basilisk C tokens.
- ast.h: the interface for the AST library.
- translate.c: the Basilisk C to C99 translator.
- stencil.c: the analyzer for Basilisk stencils and automatic boundary conditions.
- references.c: find references to non-local variables
- kernels.c: computation kernels (e.g. for GPUs)
- interpreter/README: A generic interpreter for Basilisk C.
- interpreter/dimension.c: Uses the interpreter to check dimensional consistency.
- macro.h: Basilisk macros.
Example of syntax tree generation
A graphical representation of the syntax tree can be obtained with the utility program expr.c.
For example
make expr
./expr 'int main() { printf ("Hello world!"); }'gives the (rather long) tree-representation
root
└─translation_unit
└─external_declaration
└─function_definition
├─function_declaration
│ ├─declaration_specifiers
│ │ └─type_specifier
│ │ └─types
│ │ └─INT int :1
│ └─declarator
│ └─direct_declarator
│ ├─direct_declarator
│ │ └─generic_identifier
│ │ └─IDENTIFIER main :1
│ ├─'(' ( :1
│ └─')' ) :1
└─compound_statement
├─'{' { :1
├─block_item_list
│ └─block_item
│ └─statement
│ └─expression_statement
│ ├─expression
│ │ └─assignment_expression
│ │ └─conditional_expression
│ │ └─logical_or_expression
│ │ └─logical_and_expression
│ │ └─inclusive_or_expression
│ │ └─exclusive_or_expression
│ │ └─and_expression
│ │ └─equality_expression
│ │ └─relational_expression
│ │ └─shift_expression
│ │ └─additive_expression
│ │ └─multiplicative_expression
│ │ └─cast_expression
│ │ └─unary_expression
│ │ └─postfix_expression
│ │ └─function_call
│ │ ├─postfix_expression
│ │ │ └─primary_expression
│ │ │ └─IDENTIFIER printf :1
│ │ ├─'(' ( :1
│ │ ├─argument_expression_list
│ │ │ └─argument_expression_list_item
│ │ │ └─assignment_expression
│ │ │ └─conditional_expression
│ │ │ └─logical_or_expression
│ │ │ └─logical_and_expression
│ │ │ └─inclusive_or_expression
│ │ │ └─exclusive_or_expression
│ │ │ └─and_expression
│ │ │ └─equality_expression
│ │ │ └─relational_expression
│ │ │ └─shift_expression
│ │ │ └─additive_expression
│ │ │ └─multiplicative_expression
│ │ │ └─cast_expression
│ │ │ └─unary_expression
│ │ │ └─postfix_expression
│ │ │ └─primary_expression
│ │ │ └─string
│ │ │ └─STRING_LITERAL "Hello world!" :1
│ │ └─')' ) :1
│ └─';' ; :1
└─'}' } :1
