Commit graph

32 commits

Author SHA1 Message Date
turleypol
cccf84dfc8
Fewer compile warnings (#413)
* added escriptgrammar as external lib where it belongs. Silenced warnings.

* bscript compiler warning fixes

* special include file to get rid of gcc warnings about antlr4

* misc windows warnings

* time specifc warnings

* buildfix + apple warnings

* never trust apple

* windows debug build warnings

* some windows clang warnings

* last warning fix
2021-08-28 22:26:15 +02:00
Kevin Eady
e41f70d72e
Add support for interpolated strings ("interstrings") (#369)
* Update grammar to support interpolated strings

* Struct initializers, case switchs are regular strings

* Initial stub for interpolated string in AST
This splits the previous STRING_LITERAL terminal into a production,
stringLiteral, to handle REGULAR_STRING terminal and interpolatedString
production.

* Change interpolated strings to expressions

* Fix mode handling in grammar

* Grammar fixes
- Fix mode handling in lexer
- Interpolated strings only have one expression

* Can successfully parse, stub compile interstrings
$"He {there + print("hello")}";

* Add formatting string to grammar

* Fix tests, and add test stubs

* Rename curleys to brace; better AST generation

* initial work interstring instruction

* Initial work on formatted string instruction: emit

* Formatted string instruction: execution

* Add simple formatted string test

* Add formatted string test src

* Review changes #1
- Rename `FormattedString` to `FormatExpression`
- Rename overloaded `try_to_format()` to `get_formatted()`

* Review changes part 2
- Rename `InterpolatedString` ast node to `InterpolateString`

* Review changes part 3
- Modify `ins_interpolate_string`

* Review changes part 4
- Remove unused formal parameter

* Add negative tests

* Spruce up positive tests

* Fix braces, escape chars inside interstring

* Fix, add tests for escaped char and double brace

* Address differences for new lines in tests

* Update Escript version

* Make empty expression an error

* Add documentation for interpolated strings

* Quick touchup on docs
2021-03-11 22:48:16 +01:00
Kevin Eady
0cd9412066
Properly scope the compiler includes to the Bscript folder. (#360) 2021-02-25 16:53:22 +01:00
Eric Swanson
c2e6722ed5
Clean up warnings: size_t/unsigned mixing, unused private variables (#352) 2020-12-01 02:23:03 -08:00
Eric Swanson
1567241871
New compiler: write debug info (.dbg and .dbg.txt) (#302)
Also: OG compiler debug info for foreach iterator changed to match actual variable name

Adds:
- ast/DebugStatementMarker: for "intrusive debug" (ecompile -i) instructions
- codegen/DebugBlockGuard: pushes and pops debug block #
- format/DebugStoreSerializer: writes .dbg and .dbg.txt files
- representation/DebugBlock: holds parent block # and local variable names for each block
- representation/DebugStore: holds all debug information
2020-09-12 14:26:58 -07:00
Eric Swanson
e8c621136c
New compiler: add elvis operator (#293)
Adds:
- ast/ElvisOperator
2020-09-09 23:11:51 -07:00
Eric Swanson
f2a8c9e480
New compiler: add support for function references (#289)
Adds:
- ast/FunctionReference
2020-09-08 23:20:32 -07:00
Eric Swanson
7c98acf558
New compiler: operators on object members (#288)
* Add support: += *= etc on object members
* Add support for post/prefix operators ++ and -- with object members

Adds:
- ast/SetMemberByOperator
2020-09-08 19:57:38 -07:00
Eric Swanson
ee9ad368de
Add for loops (basic and c-style) (#287)
Adds:
- ast/BasicForLoop
- ast/CstyleForLoop
2020-09-08 01:56:30 -07:00
Eric Swanson
45a2e53351
Add support for exported functions (#284) 2020-09-07 12:35:17 -07:00
Eric Swanson
90957a66c6
New compiler: add error initializers (#281)
Adds:
- ast/ErrorInitializer: AST node to create a new error object
2020-09-07 00:58:31 -07:00
Eric Swanson
431978d81a
New compiler: get and set object members (. operator) (#280)
Adds:
- ast/GetMember: AST node for dot-operator access
- ast/SetMember: AST node for optimized assignment operator + dot-operator
2020-09-07 00:00:26 -07:00
Eric Swanson
e7b5c09f35
Add struct initialization. (#279)
Adds:
- ast/StructInitializer: AST node for the overall struct
- ast/StructMemberInitializer: AST node for initialization of a single field
2020-09-06 23:24:53 -07:00
Eric Swanson
ebb186a357
Add support for set and get by index (arrays and dictionaries) (#278)
Adds:
- ast/ElementAccess: AST node for x[a] or x[a,b,...] (may be get or set)
- ast/ElementAssignment: AST node for x[a] := b;
- ast/ElementIndexes: AST node to hold all indexes for element lookup
- optimizer/AssignmentOptimizer: optimizes := in different circumstances
2020-09-06 14:03:02 -07:00
Eric Swanson
002ea6fbba
Add support for dictionary creation (#277)
Adds:
- ast/DictionaryEntry: AST node for a key -> value pair in a dictionary initializdr
- ast/DictionaryInitializer: AST node for creating a new dictionary
- ast/UninitializedValue: AST node for an uninit object
2020-09-06 04:02:37 -07:00
Eric Swanson
966b3acf5a
Add foreach loops (#275)
Adds:
- ast/ForeachLoop: AST node
2020-09-06 01:22:47 -07:00
Eric Swanson
103c27a9af
New compiler: array initialization (#274)
* Add array initialization

Adds:
- ast/ArrayInitializer: AST node for an expression that creates an array
2020-09-06 00:13:49 -07:00
Eric Swanson
f3202547fb
New compiler: Add support for case statements (#272)
Adds:
- ast/CaseDispatchDefaultSelector: AST node for a "default:" selector
- ast/CaseDispatchGroup: AST node for a collection of selectors and the code to execute
- ast/CaseDispatchGroups: AST node holding all groups in a case statement
- ast/CaseDispatchSelectors: AST node holding all selectors for one group
- ast/CaseStatement: AST node for a whole case statement
- codegen/CaseDispatchGroupVisitor: knows what to put in a case jump dispatch table
- codegen/CaseJumpDataBlock: knows how to build the entries in the data block

Also, detect multiple case selectors with the same value (or default).  This is different from the OG compiler, which only detected duplicate `default:` selectors.
2020-09-05 20:41:58 -07:00
Eric Swanson
805cc2f314
New compiler: assignment to local and global variables. (#269)
Adds:
- ast/AssignVariableConsume: AST node for assignment to a variable, while consuming the result
- optimizer/ValueConsumerOptimizer: Optimizes expressions where the resulting value will be consumed
2020-09-04 00:10:38 -07:00
Eric Swanson
2b1e8a14ca
Add binary operators (#265) 2020-09-01 22:49:48 -07:00
Eric Swanson
b3bd302785
Add limited support for user functions (#262)
Adds:
- ast/UserFunction AST node for user-defined functions.
- astbuilder/AvailableUserFunction: reference to a parse tree for a user function.
  - The AST builder only generates ASTs for user functions that are actually referenced.
- astbuilder/UserFunctionVisitor: visits (builds an AST for) a parse tree for a user function.
  - This happens after the .src or .inc file has been otherwise processed, so this class serves to hook up the correct SourceFileIdentifier to the AST.
2020-08-31 18:46:27 -07:00
Eric Swanson
98e74bd7dc
New compiler: add return and exit statements (#261)
Add:
- ast/ExitStatement: AST node for the exit statement.
- ast/ReturnStatement: AST node for the return statement.
  - only handles top-level returns and returns inside program declarations, which do the same thing: progend.
2020-08-30 22:55:30 -07:00
Eric Swanson
95e604e417
Add support for if-then-else statements (#259)
Adds:
- ast/Block: a block scope that allows declaring local variables
- ast/IfThenElseStatement: AST node for if..elseif..else..endif statements
- model/FlowControlLabel: provides an anchor for jumps or calls.
  - Function calls, break statements, continue statements, and loops will all use these.
2020-08-30 17:03:26 -07:00
Eric Swanson
64503c2866
var statements in program blocks (#256)
Adds:
- analyzer/LocalVariableScope: tracks local variables created within a given scope.
  - Instantiated on the stack during semantic analysis, this registers itself with LocalVariableScopes during construction and deregisters itself during destruction.
  - Detects unused variables during deregistration
- analyzer/LocalVariableScopes: this is what LocalVariableScope registers with.
  - keeps track of the stack of local scopes.
  - can provide the current local scope, for var statements.

Other notes:

"Shadowed" variables: this is when a variable in one scope hides a variable in another, like so:
    var a := 2;
    if (a)
        var a := 3;
        a := 4;
    endif
    print(a); // still 2
"debug_variables": We'll use these later when writing debug files.
2020-08-30 01:32:38 -07:00
Eric Swanson
a77ddd028e
New compiler: Add optimized unary expressions (#244)
Adds:
- UnaryOperator: AST node for unary operators -, ++, --, and so forth
- UnaryOperatorOptimizer: optimizes a unary operator with its operand
  - now integer and float negation, and integer inversion
  - later x[y]++ to a single instruction

Also:
- automatically include basic.em, which includes some parameter defaults like -1.

This allows the compiler to generate output for a hello, world script with the exact same .ecl output as the legacy compiler.
2020-08-26 19:24:47 -07:00
Eric Swanson
5e85fcc9e4
New compiler: Add IntegerValue (#243) 2020-08-25 23:27:24 -07:00
Eric Swanson
9bbc0518f8
Compiler rewrite: add global variables (#241)
Adds support for var statements at the global level.

Adds:
- analyzer/Variables: keeps track of the variables in scope (either local or global).
- ast/Identifier: AST node for an identifier.
  - The optimizer will replace constant identifiers with their constant value (in a later commit).
  - The semantic analyzer will set the variable field for local or global variable identifiers.
- ast/VarStatement: AST node for a var statement.
  - A single var statement will generate one VarStatement per variable declared.
- model/Variable: Describes a variable, including its index within its scope.
2020-08-25 00:57:03 -07:00
Eric Swanson
cf42b03e3c
New compiler: Add AST nodes for function calls. Can compile hello world. (#240)
Adds:
- ast/Argument: AST node for an argument passed to a function.
- ast/FunctionCall: AST node for a function call.
- codegen/ModuleDeclarationRegistrar: The code generator registers module function declarations with this in order to determine module indexes and function indexes for instructions.
- model/FunctionLink: this is a reference either:
  - from: a FunctionCall or a FunctionReference
  - to: a ModuleFunctionDeclaration or a UserFunction
- optimizer/ReferencedFunctionGatherer: a visitor that determines which module functions and user functions are referenced, by looking at function calls and function references.

Also:
- CodeGenerator registers module functions
- InstructionGenerator generates code for function calls
- InstructionEmitter generates TOK_FUNC instructions
- StoredTokenDecoder decodes TOK_FUNC instructions

After all of this, the compiler can compile print("hello, world");
2020-08-24 01:47:38 -07:00
Eric Swanson
47aeb634d6
New compiler: Add StringValue (#235)
* Add StringValue
2020-08-20 10:27:35 +02:00
Eric Swanson
81331b7200
Add FloatValue (#233) 2020-08-19 19:43:08 +02:00
Eric Swanson
f93573ae51
Add SourceFileProcessor, ValueConsumer (#232)
* Add astbuilder/ SourceFileProcessor

* Add ast/ ValueConsumer

Co-authored-by: Fernando Rozenblit <rozenblit@gmail.com>
2020-08-18 23:32:57 -07:00
Eric Swanson
97f669f94a
Add instruction generator, emitter, emit progend (#211)
* Add codegen/InstructionEmitter

* Add codegen/InstructionGenerator

* CodeGenerator: emit progend

Checkpoint: compiler can compile an empty file

* Comment reason for having both emit and emitter.
2020-08-12 10:30:06 +02:00