Updated spec a little
This commit is contained in:
parent
deae98001d
commit
b0c5130858
|
@ -145,7 +145,7 @@ referring to usually the name of a function. The result of a call may be assigne
|
|||
any type matching the function's return type. Since it contains inherent type
|
||||
information, it may be directly assigned to an interface.
|
||||
### Method call
|
||||
Method call calls upon the method of the variable before the dot that is
|
||||
Method call calls upon the method (of the expression before the dot) that is
|
||||
specified by the first argument, passing the rest of the arguments to the
|
||||
method. The first argument must be a method name. The result of a call may be
|
||||
assigned to any type matching the method's return type. Since it contains
|
||||
|
@ -258,12 +258,15 @@ does not return anything, the return statement does not accept a value. In all
|
|||
cases, return statements have no value and may not be assigned to anything.
|
||||
### Assignment
|
||||
Assignment allows assigning the result of one expression to one or more location
|
||||
expressions. The assignment statement itself has no value and may not be
|
||||
expressions. The assignment expression itself has no value and may not be
|
||||
assigned to anything.
|
||||
|
||||
# Syntax entities
|
||||
|
||||
Below is a rough syntax description of the language.
|
||||
Below is a rough syntax description of the language. Note that `<assignment>`
|
||||
is right-associative, and `<memberAccess>` and `<methodCall>` are
|
||||
left-associative. I invite you to torture yourself by attempting to implement
|
||||
this without hand-writing a parser.
|
||||
|
||||
```
|
||||
<file> -> (<typedef> | <function> | <method>)*
|
||||
|
@ -281,8 +284,8 @@ Below is a rough syntax description of the language.
|
|||
<pointerType> -> "*" <type>
|
||||
<sliceType> -> "*" ":" <type>
|
||||
<arrayType> -> <intLiteral> ":" <type>
|
||||
<structType> -> "(" <declaration>* ")"
|
||||
<interfaceType> -> "(" <signature> ")"
|
||||
<structType> -> "(" "." <declaration>* ")"
|
||||
<interfaceType> -> "(" "~" <signature>* ")"
|
||||
|
||||
<expression> -> <intLiteral>
|
||||
| <floatLiteral>
|
||||
|
@ -302,25 +305,26 @@ Below is a rough syntax description of the language.
|
|||
| <operation>
|
||||
| <block>
|
||||
| <memberAccess>
|
||||
| <methodCall>
|
||||
| <ifelse>
|
||||
| <loop>
|
||||
| <break>
|
||||
| <return>
|
||||
<statement> -> <expression> | <assignment>
|
||||
| <assignment>
|
||||
<variable> -> <identifier>
|
||||
<declaration> -> <identifier> ":" <type>
|
||||
<call> -> "[" <expression>+ "]"
|
||||
<subscript> -> "[" "." <expression> <expression> "]"
|
||||
<slice> -> "[" "\" <expression> <expression>? ":" <expression>? "]"
|
||||
<slice> -> "[" "\" <expression> <expression>? "/" <expression>? "]"
|
||||
<length> -> "[" "#" <expression> "]"
|
||||
<dereference> -> "[" "." <expression> "]"
|
||||
<reference> -> "[" "@" <expression> "]"
|
||||
<valueCast> -> "[" "~" <type> <expression> "]"
|
||||
<bitCast> -> "[" "~~" <type> <expression> "]"
|
||||
<operation> -> "[" <operator> <expression>* "]"
|
||||
<block> -> "{" <statement>* "}"
|
||||
<memberAccess> -> <variable> "." <identifier>
|
||||
<methodAccess> -> <variable> "." <call>
|
||||
<block> -> "{" <expression>* "}"
|
||||
<memberAccess> -> <expression> "." <identifier>
|
||||
<methodCall> -> <expression> "." <call>
|
||||
<ifelse> -> "if" <expression>
|
||||
"then" <expression>
|
||||
["else" <expression>]
|
||||
|
@ -336,7 +340,7 @@ Below is a rough syntax description of the language.
|
|||
<floatLiteral> -> /-?[0-9]*\.[0-9]+/
|
||||
<stringLiteral> -> /'.*'/
|
||||
<arrayLiteral> -> "(*" <expression>* ")"
|
||||
<structLiteral> -> "(" <member>* ")"
|
||||
<structLiteral> -> "(." <member>* ")"
|
||||
<booleanLiteral> -> "true" | "false"
|
||||
|
||||
<member> -> <identifier> ":" <expression>
|
||||
|
|
Loading…
Reference in New Issue