|
@@ -9,7 +9,8 @@ keyword = first:identifier last:[:] {return first + last}
|
|
|
className = first:[A-Z] others:[a-zA-Z0-9]* {return first + others.join("")}
|
|
|
string = ['] val:(("''" {return "'"} / [^'])*) ['] {
|
|
|
return smalltalk.ValueNode._new()
|
|
|
- ._value_(val.join("").replace(/\"/ig, '"'))
|
|
|
+ ._position_((line).__at(column))
|
|
|
+ ._value_(val.join("").replace(/\"/ig, '"'));
|
|
|
}
|
|
|
|
|
|
symbol = "#"val:(
|
|
@@ -17,24 +18,29 @@ symbol = "#"val:(
|
|
|
/ node:string {return node._value()})*
|
|
|
{
|
|
|
return smalltalk.ValueNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
|
|
|
}
|
|
|
number = n:(float / integer) {
|
|
|
return smalltalk.ValueNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(n)
|
|
|
}
|
|
|
float = neg:[-]?int:[0-9]+ "." dec:[0-9]+ {return parseFloat((neg + int.join("") + "." + dec.join("")), 10)}
|
|
|
integer = neg:[-]?digits:[0-9]+ {return (parseInt(neg+digits.join(""), 10))}
|
|
|
literalArray = "#(" ws lits:(lit:literal ws {return lit._value()})* ws ")" {
|
|
|
return smalltalk.ValueNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(lits)
|
|
|
}
|
|
|
dynamicArray = "{" ws expressions:expressions? ws "."? "}" {
|
|
|
return smalltalk.DynamicArrayNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._nodes_(expressions)
|
|
|
}
|
|
|
dynamicDictionary = "#{" ws expressions: expressions? ws "}" {
|
|
|
return smalltalk.DynamicDictionaryNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._nodes_(expressions)
|
|
|
}
|
|
|
pseudoVariable = val:(
|
|
@@ -42,6 +48,7 @@ pseudoVariable = val:(
|
|
|
/ 'false' {return false}
|
|
|
/ 'nil' {return nil}) {
|
|
|
return smalltalk.ValueNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(val)
|
|
|
}
|
|
|
literal = pseudoVariable / number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block
|
|
@@ -49,10 +56,12 @@ literal = pseudoVariable / number / literalArray / dynamicDictionary / dy
|
|
|
|
|
|
variable = identifier:varIdentifier {
|
|
|
return smalltalk.VariableNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(identifier)
|
|
|
}
|
|
|
classReference = className:className {
|
|
|
return smalltalk.ClassReferenceNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._value_(className)
|
|
|
}
|
|
|
|
|
@@ -90,12 +99,14 @@ expressions = first:expression others:expressionList* {
|
|
|
|
|
|
assignment = variable:variable ws ':=' ws expression:expression {
|
|
|
return smalltalk.AssignmentNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._left_(variable)
|
|
|
._right_(expression)
|
|
|
}
|
|
|
|
|
|
ret = '^' ws expression:expression ws '.'? {
|
|
|
return smalltalk.ReturnNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._nodes_([expression])
|
|
|
}
|
|
|
|
|
@@ -117,12 +128,14 @@ statements = ret:ret [.]* {return [ret]}
|
|
|
|
|
|
sequence = temps:temps? ws statements:statements? ws {
|
|
|
return smalltalk.SequenceNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._temps_(temps || [])
|
|
|
._nodes_(statements || [])
|
|
|
}
|
|
|
|
|
|
block = '[' ws params:blockParamList? ws sequence:sequence? ws ']' {
|
|
|
return smalltalk.BlockNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._parameters_(params || [])
|
|
|
._nodes_([sequence._asBlockSequenceNode()])
|
|
|
}
|
|
@@ -133,6 +146,7 @@ operand = literal / reference / subexpression
|
|
|
|
|
|
unaryMessage = ws selector:unarySelector ![:] {
|
|
|
return smalltalk.SendNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._selector_(selector)
|
|
|
}
|
|
|
|
|
@@ -156,6 +170,7 @@ unarySend = receiver:operand ws tail:unaryTail? {
|
|
|
|
|
|
binaryMessage = ws selector:binarySelector ws arg:(unarySend / operand) {
|
|
|
return smalltalk.SendNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._selector_(selector)
|
|
|
._arguments_([arg])
|
|
|
}
|
|
@@ -187,6 +202,7 @@ keywordMessage = ws pairs:(pair:keywordPair ws {return pair})+ {
|
|
|
args.push(pairs[i].arg);
|
|
|
}
|
|
|
return smalltalk.SendNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._selector_(selector.join(""))
|
|
|
._arguments_(args)
|
|
|
}
|
|
@@ -204,18 +220,21 @@ cascade = ws send:(keywordSend / binarySend) messages:(ws ";" ws mess:mes
|
|
|
cascade.push(messages[i]);
|
|
|
}
|
|
|
return smalltalk.CascadeNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._receiver_(send._receiver())
|
|
|
._nodes_(cascade)
|
|
|
}
|
|
|
|
|
|
jsStatement = "<" val:((">>" {return ">"} / [^>])*) ">" {
|
|
|
return smalltalk.JSStatementNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._source_(val.join(""))
|
|
|
}
|
|
|
|
|
|
|
|
|
method = ws pattern:(keywordPattern / binaryPattern / unaryPattern) ws sequence:sequence? ws {
|
|
|
return smalltalk.MethodNode._new()
|
|
|
+ ._position_((line).__at(column))
|
|
|
._selector_(pattern[0])
|
|
|
._arguments_(pattern[1])
|
|
|
._nodes_([sequence])
|