Skip to content

Instantly share code, notes, and snippets.

@TestSubjector
Last active August 31, 2023 11:15
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TestSubjector/6a407f9a4ba5996a1692c9b9f6c0eb84 to your computer and use it in GitHub Desktop.
Save TestSubjector/6a407f9a4ba5996a1692c9b9f6c0eb84 to your computer and use it in GitHub Desktop.
Context Free Grammar For Julia

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

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 > ::= '#' | /.*/  
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment