Grammar

The grammar page provides a detailed description of the Gossip-lang grammar, including information on the different types of expressions, statements, and literals used in the language.

program: expression*

expression:
    | "let" atomic_expression "=" expression "in" expression ";"
    | "assign" atomic_expression "=" expression ";"
    | "print(" expression ");"
    | "range" "(" atomic_expression "," atomic_expression ")"
    | "if" expression "then" expression
    | "if" expression "then" expression "else" expression ";"
    | "while" expression "do" expression ";"
    | "for" atomic_expression "in" expression "do" expression ";"
    | "declare" atomic_expression "=" expression ";"
    | "repeat" expression "while" expression ";"
    | "deffunct" atomic_expression "("  (atomic_expression,",")*  ")"  AST_sequence ";"
    | "callfun" atomic_expression "("  (expression, ",")*  ")" ";"
    | "functret" "(" expression ")" ";"
    | "'" atomic_expression "'"
    | "[" (expression, ",")* "]"
    | simple_expression

AST_sequence:
    | "{" expression* "}"
    
simple_expression:
    | comparison_expression
    | comparison_expression "&&" comparison_expression
    | comparison_expression "||" comparison_expression
    

comparison_expression:
    | addition_expression
    | addition_expression "+ - * ** / < > <= >= == != = % & && || | !"  addition_expression


addition_expression:
    | multiplication_expression
    | multiplication_expression   ("+-", multiplication_expression)*


multiplication_expression:
    | modulo_expression
    | modulo_expression ("*/", modulo_expression)*


modulo_expression:
    | uneg_expression
    | uneg_expression ("%", uneg_expression)*


uneg_expression:
    | "-" atomic_expression
    | atomic_expression

atomic_expression:
    | Identifier "." list_op
    | Identifier "[" slice "]"
    | Number
    | Bool

list_op:
    | head
    | tail
    | empty
    | cons "(" expression ")"

slice:
    | expression
    | expression "," expression
   
Identifier:
    | /[a-zA-Z_][a-zA-Z0-9_]*/

Number:
    | /[0-9]+(\.[0-9]+)?/

Bool:
    | True
    | False