Нет описания

runningwater 5ef7aa1907 resolving and binding 2 лет назад
.idea 9217c81b18 Parsing function and call -- 2 лет назад
doc 73ff604276 first interpreter framework 2 лет назад
src 5ef7aa1907 resolving and binding 2 лет назад
.gitignore 3d2508ae84 first commit 2 лет назад
README.md 725676d576 Local Functions and Closures 2 лет назад
pom.xml 3d2508ae84 first commit 2 лет назад

README.md

Lox

 // Your first Lox program!
 print "Hello, world!";
  • Dynamic typing
  • Automatic memory management
  • Data Types
    • Booleans
    • Numbers
    • Strings
    • Nil
  • Expressions
    • Arithmetic
    • Comparison and equality
    • Logical operators
    • Precedence and grouping
  • Statements
  • Variables
  • Control Flow
  • Functions
  • Closures
  • Classes

A Grammar for Lox expressions

  • Literals. Numbers,strings,Booleans, and nil
  • Unary expressions. A prefix ! to perform a logical not, and - to negate a number.

    • Binary expressions. The infix arithmetic(+,-,*,/) and logic operators (==, !=, <, <=,>,>=)

      • Parentheses. A pair of ( and ) wrapped around and expression.

        • Syntax tree - Expression

          expression     → literal
          | unary
          | binary
          | grouping ;
          
          literal        → NUMBER | STRING | "true" | "false" | "nil" ;
          grouping       → "(" expression ")" ;
          unary          → ( "-" | "!" ) expression ;
          binary         → expression operator expression ;
          operator       → "==" | "!=" | "<" | "<=" | ">" | ">="
          | "+"  | "-"  | "*" | "/" ;
          
          

        | Name | Operators | Associates |

              |------------|-----------|------------|
        

        | Equality | == != | Left | | Comparison | > >= < <= | Left | | Term | - + | Left | | Factor | / * | Left | | Unary | ! - | Right |

          expression     → equality ;
          equality       → comparison ( ( "!=" | "==" ) comparison )* ;
          comparison     → term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
          term           → factor ( ( "-" | "+" ) factor )* ;
          factor         → unary ( ( "/" | "*" ) unary )* ;
          unary          → ( "!" | "-" ) unary
                         | primary | call ;
          call           → primary( "(" arguments? ")" )* ;
          arguments       → expression ( "," expression)* ;
          primary        → NUMBER | STRING | "true" | "false" | "nil"
                         | "(" expression ")" | IDENTIFIER ;
        
        • Syntax tree - Statement

          program        → statement* EOF ;
                
          statement      → exprStmt
                         | printStmt 
                         | block;
                      
          block         → "{" declaration* "}"
                
          exprStmt       → expression ";" ;
          printStmt      → "print" expression ";" ;
          

        A program is a list of statements followed by the special "end of file" token. The mandatory end token ensures the parse consumes the entire input and don't silently ignore erroneous unconsumed tokens at the end of a script.

        • Syntax tree - add Variable syntax

          program   → declaration* EOF ;
                    
          declaration  → funDecl
                       | varDecl
                       | statement ;
          
          statement      → exprStmt
                         | forStmt
                         | ifStmt
                         | printStmt
                         | returnStmt
                         | whileStmt
                         | block ;
           funDecl       → "fun" function;
           function      →  IDENTIFIER "(" parameters? ")" block ;
           block         → "{" declaration* "}"
           ifStmt        → "if" "(" expression ")" statement ( "else" statement)? ;
                      
          varDecl  → "var" IDENTIFIER ( "=" expression )? ";" ;
          returnStmt → "return" expression? ";";
          
        • Syntax tree -- Logical Operators

          expression     → assignment ;
          assignment     → IDENTIFIER "=" assignment
          | logic_or ;
          logic_or       → logic_and ( "or" logic_and )* ;
          logic_and      → equality ( "and" equality )* ;
          

        whileStmt → "while" "(" expression ")" statement ; forStmt → "for" " (" (varDecl | exprStmt | ";")

                  expression? ";" expression? ")" statement ;