Added increment/decrement operators.
This commit is contained in:
parent
0b78c1dafe
commit
59374db502
4 changed files with 110 additions and 4 deletions
|
@ -102,8 +102,8 @@ namespace arookas
|
||||||
public sunExpression TrueBody { get { return this[1] as sunExpression; } }
|
public sunExpression TrueBody { get { return this[1] as sunExpression; } }
|
||||||
public sunExpression FalseBody { get { return this[2] as sunExpression; } }
|
public sunExpression FalseBody { get { return this[2] as sunExpression; } }
|
||||||
|
|
||||||
public sunTernaryOperator(sunSourceLocation node)
|
public sunTernaryOperator(sunSourceLocation location)
|
||||||
: base(node)
|
: base(location)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -119,4 +119,90 @@ namespace arookas
|
||||||
context.Text.ClosePoint(trueEpilogue);
|
context.Text.ClosePoint(trueEpilogue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// increment/decrement
|
||||||
|
class sunPostfixAugment : sunOperand
|
||||||
|
{
|
||||||
|
public sunIdentifier Variable { get { return this[0] as sunIdentifier; } }
|
||||||
|
public sunAugment Operator { get { return this[1] as sunAugment; } }
|
||||||
|
|
||||||
|
public sunPostfixAugment(sunSourceLocation location)
|
||||||
|
: base(location)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Compile(sunContext context)
|
||||||
|
{
|
||||||
|
var variableInfo = context.ResolveVariable(Variable);
|
||||||
|
if (Parent is sunOperand)
|
||||||
|
{
|
||||||
|
context.Text.PushVariable(variableInfo);
|
||||||
|
}
|
||||||
|
Operator.Compile(context, variableInfo);
|
||||||
|
context.Text.StoreVariable(variableInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class sunPrefixAugment : sunOperand
|
||||||
|
{
|
||||||
|
public sunAugment Operator { get { return this[0] as sunAugment; } }
|
||||||
|
public sunIdentifier Variable { get { return this[1] as sunIdentifier; } }
|
||||||
|
|
||||||
|
public sunPrefixAugment(sunSourceLocation location)
|
||||||
|
: base(location)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Compile(sunContext context)
|
||||||
|
{
|
||||||
|
var variableInfo = context.ResolveVariable(Variable);
|
||||||
|
Operator.Compile(context, variableInfo);
|
||||||
|
context.Text.StoreVariable(variableInfo);
|
||||||
|
if (Parent is sunOperand)
|
||||||
|
{
|
||||||
|
context.Text.PushVariable(variableInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class sunAugment : sunNode
|
||||||
|
{
|
||||||
|
protected sunAugment(sunSourceLocation location)
|
||||||
|
: base(location)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void Compile(sunContext context, sunVariableInfo variable);
|
||||||
|
}
|
||||||
|
|
||||||
|
class sunIncrement : sunAugment
|
||||||
|
{
|
||||||
|
public sunIncrement(sunSourceLocation location)
|
||||||
|
: base(location)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Compile(sunContext context, sunVariableInfo variable)
|
||||||
|
{
|
||||||
|
context.Text.IncVariable(variable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class sunDecrement : sunAugment
|
||||||
|
{
|
||||||
|
public sunDecrement(sunSourceLocation location)
|
||||||
|
: base(location)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Compile(sunContext context, sunVariableInfo variable)
|
||||||
|
{
|
||||||
|
context.Text.DecVariable(variable);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,8 +132,8 @@ Loops may be named. To name a loop, simply prefix the loop with a label. `break`
|
||||||
|
|
||||||
```
|
```
|
||||||
outer_loop:
|
outer_loop:
|
||||||
for (var a; a < 4; a += 1) {
|
for (var a; a < 4; ++a) {
|
||||||
for (var b; b < 4; b += 1) {
|
for (var b; b < 4; ++b) {
|
||||||
if (b == 2) break outer_loop;
|
if (b == 2) break outer_loop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
10
parser.cs
10
parser.cs
|
@ -61,9 +61,11 @@ namespace arookas
|
||||||
case __sunConstants.STATEMENT:
|
case __sunConstants.STATEMENT:
|
||||||
case __sunConstants.COMPOUND_STATEMENT:
|
case __sunConstants.COMPOUND_STATEMENT:
|
||||||
case __sunConstants.COMPOUND_STATEMENT_ITEM:
|
case __sunConstants.COMPOUND_STATEMENT_ITEM:
|
||||||
|
case __sunConstants.VARIABLE_AUGMENT:
|
||||||
case __sunConstants.ASSIGNMENT_OPERATOR:
|
case __sunConstants.ASSIGNMENT_OPERATOR:
|
||||||
case __sunConstants.BINARY_OPERATOR:
|
case __sunConstants.BINARY_OPERATOR:
|
||||||
case __sunConstants.UNARY_OPERATOR:
|
case __sunConstants.UNARY_OPERATOR:
|
||||||
|
case __sunConstants.AUGMENT_OPERATOR:
|
||||||
case __sunConstants.TERM:
|
case __sunConstants.TERM:
|
||||||
case __sunConstants.PARAMETER:
|
case __sunConstants.PARAMETER:
|
||||||
case __sunConstants.ARGUMENT_LIST:
|
case __sunConstants.ARGUMENT_LIST:
|
||||||
|
@ -162,10 +164,14 @@ namespace arookas
|
||||||
case __sunConstants.ASSIGN_BIT_LSH: return new sunAssignBitLsh(location);
|
case __sunConstants.ASSIGN_BIT_LSH: return new sunAssignBitLsh(location);
|
||||||
case __sunConstants.ASSIGN_BIT_RSH: return new sunAssignBitRsh(location);
|
case __sunConstants.ASSIGN_BIT_RSH: return new sunAssignBitRsh(location);
|
||||||
|
|
||||||
|
case __sunConstants.INCREMENT: return new sunIncrement(location);
|
||||||
|
case __sunConstants.DECREMENT: return new sunDecrement(location);
|
||||||
|
|
||||||
case __sunConstants.ASSIGNMENT_OPERATOR: return new sunNode(location);
|
case __sunConstants.ASSIGNMENT_OPERATOR: return new sunNode(location);
|
||||||
case __sunConstants.TERNARY_OPERATOR: return new sunTernaryOperator(location);
|
case __sunConstants.TERNARY_OPERATOR: return new sunTernaryOperator(location);
|
||||||
case __sunConstants.BINARY_OPERATOR: return new sunNode(location);
|
case __sunConstants.BINARY_OPERATOR: return new sunNode(location);
|
||||||
case __sunConstants.UNARY_OPERATOR: return new sunNode(location);
|
case __sunConstants.UNARY_OPERATOR: return new sunNode(location);
|
||||||
|
case __sunConstants.AUGMENT_OPERATOR: return new sunNode(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
// expressions
|
// expressions
|
||||||
|
@ -180,6 +186,9 @@ namespace arookas
|
||||||
case __sunConstants.INT_CAST: return new sunIntCast(location);
|
case __sunConstants.INT_CAST: return new sunIntCast(location);
|
||||||
case __sunConstants.FLOAT_CAST: return new sunFloatCast(location);
|
case __sunConstants.FLOAT_CAST: return new sunFloatCast(location);
|
||||||
case __sunConstants.TYPEOF_CAST: return new sunTypeofCast(location);
|
case __sunConstants.TYPEOF_CAST: return new sunTypeofCast(location);
|
||||||
|
|
||||||
|
case __sunConstants.PREFIX_AUGMENT: return new sunPrefixAugment(location);
|
||||||
|
case __sunConstants.POSTFIX_AUGMENT: return new sunPostfixAugment(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
// builtins
|
// builtins
|
||||||
|
@ -207,6 +216,7 @@ namespace arookas
|
||||||
case __sunConstants.VARIABLE_DECLARATION: return new sunVariableDeclaration(location);
|
case __sunConstants.VARIABLE_DECLARATION: return new sunVariableDeclaration(location);
|
||||||
case __sunConstants.VARIABLE_DEFINITION: return new sunVariableDefinition(location);
|
case __sunConstants.VARIABLE_DEFINITION: return new sunVariableDefinition(location);
|
||||||
case __sunConstants.VARIABLE_ASSIGNMENT: return new sunVariableAssignment(location);
|
case __sunConstants.VARIABLE_ASSIGNMENT: return new sunVariableAssignment(location);
|
||||||
|
case __sunConstants.VARIABLE_AUGMENT: return new sunNode(location);
|
||||||
}
|
}
|
||||||
|
|
||||||
// constants
|
// constants
|
||||||
|
|
|
@ -100,6 +100,9 @@ ASSIGN_BIT_OR = "|="
|
||||||
ASSIGN_BIT_LSH = "<<="
|
ASSIGN_BIT_LSH = "<<="
|
||||||
ASSIGN_BIT_RSH = ">>="
|
ASSIGN_BIT_RSH = ">>="
|
||||||
|
|
||||||
|
INCREMENT = "++"
|
||||||
|
DECREMENT = "--"
|
||||||
|
|
||||||
// literals
|
// literals
|
||||||
IDENTIFIER = <<[_A-Za-z][_A-Za-z0-9]*>>
|
IDENTIFIER = <<[_A-Za-z][_A-Za-z0-9]*>>
|
||||||
DEC_NUMBER = <<-?[0-9]+\.[0-9]+>>
|
DEC_NUMBER = <<-?[0-9]+\.[0-9]+>>
|
||||||
|
@ -138,6 +141,7 @@ compound_statement_item =
|
||||||
variable_definition |
|
variable_definition |
|
||||||
variable_declaration |
|
variable_declaration |
|
||||||
variable_assignment |
|
variable_assignment |
|
||||||
|
variable_augment |
|
||||||
print_statement |
|
print_statement |
|
||||||
function_call;
|
function_call;
|
||||||
statement_block = L_BRACE {statement} R_BRACE;
|
statement_block = L_BRACE {statement} R_BRACE;
|
||||||
|
@ -161,6 +165,7 @@ binary_operator =
|
||||||
EQ | NEQ | LT | LTEQ | GT | GTEQ | // comparison
|
EQ | NEQ | LT | LTEQ | GT | GTEQ | // comparison
|
||||||
LOG_AND | LOG_OR; // logical
|
LOG_AND | LOG_OR; // logical
|
||||||
unary_operator = LOG_NOT | SUB;
|
unary_operator = LOG_NOT | SUB;
|
||||||
|
augment_operator = INCREMENT | DECREMENT;
|
||||||
|
|
||||||
// expressions
|
// expressions
|
||||||
expression = operand {binary_operator operand};
|
expression = operand {binary_operator operand};
|
||||||
|
@ -171,6 +176,7 @@ term =
|
||||||
typeof_cast |
|
typeof_cast |
|
||||||
function_call |
|
function_call |
|
||||||
variable_reference |
|
variable_reference |
|
||||||
|
variable_augment |
|
||||||
STRING |
|
STRING |
|
||||||
DEC_NUMBER |
|
DEC_NUMBER |
|
||||||
HEX_NUMBER |
|
HEX_NUMBER |
|
||||||
|
@ -194,6 +200,10 @@ variable_reference = IDENTIFIER; // used in expressions
|
||||||
variable_declaration = VAR IDENTIFIER;
|
variable_declaration = VAR IDENTIFIER;
|
||||||
variable_definition = VAR IDENTIFIER assignment_operator expression;
|
variable_definition = VAR IDENTIFIER assignment_operator expression;
|
||||||
variable_assignment = IDENTIFIER assignment_operator expression;
|
variable_assignment = IDENTIFIER assignment_operator expression;
|
||||||
|
variable_augment = postfix_augment | prefix_augment;
|
||||||
|
|
||||||
|
postfix_augment = IDENTIFIER augment_operator;
|
||||||
|
prefix_augment = augment_operator IDENTIFIER;
|
||||||
|
|
||||||
// functions
|
// functions
|
||||||
function_definition = FUNCTION IDENTIFIER parameter_list statement_block;
|
function_definition = FUNCTION IDENTIFIER parameter_list statement_block;
|
||||||
|
|
Loading…
Reference in a new issue