|
@@ -37,17 +37,19 @@ GETTER -> get ORIGIN .
|
|
|
ORIGIN -> word | SETTER | GETTER .
|
|
|
|
|
|
|
|
|
-Or with methods variant
|
|
|
+Or with simple operators variant.
|
|
|
|
|
|
PROGRAM -> STATEMENTS.
|
|
|
CLOSED -> BLOCK | LIST | PARENTHESIS .
|
|
|
STATEMENTS -> STATEMENT STATEMENTS | .
|
|
|
STATEMENT -> CLOSED | EXPRESSION eos | eos .
|
|
|
-COMMAND -> word PARAMETERS.
|
|
|
+COMMAND -> WORDVALUE DETAILS .
|
|
|
+DETAILS -> OPERATION | PARAMETERS .
|
|
|
+OPERATION -> operator COMMAND .
|
|
|
PARAMETERS -> PARAMETER PARAMETERS | .
|
|
|
PARAMETER -> WORDVALUE | GETTER | SETTER | CLOSED .
|
|
|
-EXPRESSION -> COMMAND | GETTER | SETTER | METHODCALL .
|
|
|
-PARENTHESIS -> closeparen EXPRESSION openparen .
|
|
|
+EXPRESSION -> COMMAND | GETTER | SETTER.
|
|
|
+PARENTHESIS -> openparen EXPRESSION closeparen .
|
|
|
BLOCK -> openblock STATEMENTS closeblock .
|
|
|
LIST -> openlist PARAMETERS closelist .
|
|
|
VALUE -> string | int | float | symbol | type .
|
|
@@ -55,8 +57,8 @@ WORDVALUE -> word | VALUE.
|
|
|
SETTER -> set TARGET .
|
|
|
TARGET -> word PARAMETER | GETTER PARAMETER .
|
|
|
GETTER -> get ORIGIN .
|
|
|
+GETCALL -> comma COMMAND | .
|
|
|
ORIGIN -> word | SETTER | GETTER .
|
|
|
-METHODCALL -> VALUE word PARAMETERS .
|
|
|
|
|
|
*
|
|
|
* program -> statements
|
|
@@ -183,6 +185,8 @@ func AstKindForToken(token Token) AstKind {
|
|
|
return AstKindValue
|
|
|
case TokenKindWord:
|
|
|
return AstKindWord
|
|
|
+ case TokenKindOperator:
|
|
|
+ return AstKindWord
|
|
|
case TokenKindType:
|
|
|
return AstKindType
|
|
|
default:
|
|
@@ -381,12 +385,28 @@ func (parser *Parser) ParseGet() *Ast {
|
|
|
return ast
|
|
|
}
|
|
|
|
|
|
+func (parser *Parser) ParseOperator(operand *Ast) *Ast {
|
|
|
+ parser.LogDebug("ParseOperator: %s\n", parser.current.String())
|
|
|
+
|
|
|
+ operator := parser.Require(TokenKindOperator)
|
|
|
+ arguments := parser.ParseArguments(operand)
|
|
|
+ command := NewAstWithToken(AstKindCommand, operator)
|
|
|
+ command.AppendChild(arguments)
|
|
|
+ return command
|
|
|
+}
|
|
|
+
|
|
|
func (parser *Parser) ParseCommand() *Ast {
|
|
|
parser.LogDebug("ParseCommand: %s\n", parser.current.String())
|
|
|
|
|
|
- word := parser.Require(TokenKindWord, TokenKindType)
|
|
|
- arguments := parser.ParseArguments()
|
|
|
- command := NewAstWithToken(AstKindCommand, word)
|
|
|
+ wordvalue := parser.ParseWordValue()
|
|
|
+
|
|
|
+ // operator command
|
|
|
+ if parser.NextIs(TokenKindOperator) {
|
|
|
+ return parser.ParseOperator(wordvalue)
|
|
|
+ }
|
|
|
+
|
|
|
+ arguments := parser.ParseArguments()
|
|
|
+ command := NewAstWithToken(AstKindCommand, wordvalue.Token())
|
|
|
command.AppendChild(arguments)
|
|
|
return command
|
|
|
}
|
|
@@ -403,14 +423,6 @@ func (parser *Parser) ParseClosed() *Ast {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (parser *Parser) ParseMethodCall() *Ast {
|
|
|
- value := parser.ParseValue()
|
|
|
- word := parser.Require(TokenKindWord, TokenKindType)
|
|
|
- command := NewAstWithToken(AstKindCommand, word)
|
|
|
- arguments := parser.ParseArguments(value)
|
|
|
- command.AppendChild(arguments)
|
|
|
- return command
|
|
|
-}
|
|
|
|
|
|
func (parser *Parser) ParseExpression() *Ast {
|
|
|
parser.LogDebug("ParseExpression: %s\n", parser.current.String())
|
|
@@ -419,7 +431,7 @@ func (parser *Parser) ParseExpression() *Ast {
|
|
|
case parser.NextIsWord(): return parser.ParseCommand()
|
|
|
case parser.NextIsSet(): return parser.ParseSet()
|
|
|
case parser.NextIsGet(): return parser.ParseGet()
|
|
|
- case parser.NextIsValue(): return parser.ParseMethodCall()
|
|
|
+ case parser.NextIsValue(): return parser.ParseCommand()
|
|
|
default:
|
|
|
parser.Panicf("Syntax error in expression, expected word, $, =, value")
|
|
|
return nil
|
|
@@ -484,6 +496,10 @@ func (parser Parser) NextIsValue() bool {
|
|
|
TokenKindSymbol)
|
|
|
}
|
|
|
|
|
|
+func (parser Parser) NextIsOperator() bool {
|
|
|
+ return parser.NextIs(TokenKindOperator)
|
|
|
+}
|
|
|
+
|
|
|
func (parser Parser) NextIsWordValue() bool {
|
|
|
return parser.NextIs(TokenKindWord, TokenKindString, TokenKindType,
|
|
|
TokenKindInteger, TokenKindFloat, TokenKindBoolean, TokenKindNil,
|