Julia Context Free Grammar

21 Oct 2018


Gists in Github Pages, lovely.

A set of production rules for the Julia programming language as part of the Principles of Programming Language course.
I have taken the slight liberty of using regex to represent the literals. Also, I will be more than happy if someone can verify the precedence, associativity and whatnot is correct.
Many of Julia's exotic operators have been removed from the the different operator productions rules for ease-of-read.

Made using the reference provided by tree-sitter-julia.

Extra Links

view raw README.md hosted with ❤ by GitHub

Julia Grammar Syntax

< program > ::= < expression_list >   
    
< expression_list > ::= < expression > < terminator > |  
                        < expression > < terminator > < expression_list >  
                          
< expression > ::= < number > |  
                   < string > |  
                   < identifier > |  
                   < pair_expression > |  
                   < call_expression > |  
                   < module_expression > |  
                   < function_expression > |  
                   < binary_expression > |  
                   < conditional_expression > |  
                   < assignment_expression > |  
                   < struct_definition > |  
                   < comment >  
                     
< terminator > ::= '\n' | ';'  
    
< module_expression > ::= 'module' < extended_identifier > 'end'  
    
< extended_identifier > ::= < identifier > |    
                            < identifier > < expression_list >  
                            
< struct_definition > ::= 'struct' < extended_typed_identifier > 'end' |  
                          'mutable' 'struct' < extended_typed_identifier > 'end'  
                          
< extended_typed_identifier > ::= < typed_identifier > |  
                                  < typed_identifier > < terminator > < extended_typed_identifier >  
                                  
< typed_identifier > ::= < parametrized_identifier > |  
                         < parametrized_identifier > < parametrized_choice > < parametrized_identifier >  
                         
< parametrized_choice > ::= '::' | '< :'  
  
< parametrized_identifier > ::= < identifier > |  
                                < identifier > '{' < modified_typed_identifier > '}'  
                                
< modified_typed_identifier > ::= < typed_identifier > |  
                                  < typed_identifier > ',' < modified_typed_identifier >  
                                  
< function_expression > ::= 'function' < identifier > < parameter_list > |  
                            'function' < identifier > < parameter_list > < expression_list > 'end'  
                            
< parameter_list > ::= '(' < extended_parameter_list > ')'  
  
< extended_parameter_list > ::= < identifier > |  
                                < identifier > ‘,’  < extended_parameter_list >  
                                
< call_expression > ::= < expression > < argument_list >  
  
< argument_list > ::= '(' < extended_argument_list > ')'   
  
< extended_argument_list > ::= < expression > |  
                               < expression > ',' < extended_argument_list >  
                               
< binary_expression > ::= < binary_expression > < times_operator > < plus_expression > |   
                          < plus_expression >  
  
< plus_expression > ::= < plus_expression > < plus_operator > < arrow_expression > |   
                        < arrow_expression >  
  
< arrow_expression > ::= < or_expression > < arrow_operator > < arrow_expression > |   
                         < or_expression >  
    
< or_expression > ::= < or_expression > '||' < and_expression > |   
                      < and_expression >   
  
< and_expression > ::= < and_expression > '&&' < assignment_expression > |   
                       < assignment_expression >  
  
< assignment_expression > ::= < pair_expression > < assign_opereator > < assignment_expression > |   
                              < pair_expression >  
  
< pair_expression > ::= < expression > '= >' < pair_expression > |  
                        < expression >  
                      
< conditional_expression > ::= 'if' < expression > < expression_list > |  
                               'if' < expression > < expression_list > < elseif_clause > |  
                               'if' < expression > < expression_list > < elseif_clause > < else_clause >  
                                
< elseif_clause > ::= 'elseif' < expression > < expression_list > |  
                      'elseif' < expression > < expression_list > < elseif_clause >  
                      
< else_clause > ::= 'else' < expression_list >  
  
< identifier > ::= /[a-zA-Z]\w*/  
< number > ::= /\d+/  
< string > ::= '"' < characters > '"'  
< characters > ::= < character > | < character > < characters >  
< character > ::= < identifier > | < number >  
  
< times_operator > ::= '*' | '/' | '÷' | '%' | '&' | '⋅' | '*' | '\\'  
< plus_opereator > ::= '+' | '-'  
< arrow_operator > ::=  '←' | '→'  
< assign_opereator > ::= ':=' | '~' | '$=' | '=' | '+=' | '-=' | '*=' |  
                         '/=' | '//=' | '|\=|' | '^=' | '÷=' | '%=' | '&='  
< comment > ::= '#' | /.*/  
view raw Grammar.md hosted with ❤ by GitHub