start = method separator = [ \t\v\f\u00A0\uFEFF\n\r\u2028\u2029]+ comments = (["][^"]*["])+ ws = (separator / comments)* identifier = first:[a-zA-Z] others:[a-zA-Z0-9]* {return first + others.join("")} varIdentifier = first:[a-z] others:[a-zA-Z0-9]* {return first + others.join("")} 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, '"')) } symbol = "#"val:( digits:[a-zA-Z0-9\:]+ {return digits.join("")} / node:string {return node._value()})* { return smalltalk.ValueNode._new() ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"'))) } number = n:(float / integer) { return smalltalk.ValueNode._new() ._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() ._value_(lits) } dynamicArray = "{" ws expressions:expressions? ws "."? "}" { return smalltalk.DynamicArrayNode._new() ._nodes_(expressions) } dynamicDictionary = "#{" ws expressions: expressions? ws "}" { return smalltalk.DynamicDictionaryNode._new() ._nodes_(expressions) } pseudoVariable = val:( 'true' {return true} / 'false' {return false} / 'nil' {return nil}) { return smalltalk.ValueNode._new()._value_(val) } literal = pseudoVariable / number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block variable = identifier:varIdentifier { return smalltalk.VariableNode._new() ._value_(identifier) } classReference = className:className { return smalltalk.ClassReferenceNode._new() ._value_(className) } reference = variable / classReference keywordPair = key:keyword ws arg:binarySend ws {return {key:key, arg: arg}} binarySelector = bin:[\\+*/=><,@%~|&-]+ {return bin.join("").replace(/\\/g, '\\\\')} unarySelector = identifier keywordPattern = pairs:(ws key:keyword ws arg:identifier {return {key:key, arg: arg}})+ { var keywords = []; var params = []; for(var i=0;i>" {return ">"} / [^>])*) ">" { return smalltalk.JSStatementNode._new() ._source_(val.join("")) } method = ws pattern:(keywordPattern / binaryPattern / unaryPattern) ws sequence:sequence? ws { return smalltalk.MethodNode._new() ._selector_(pattern[0]) ._arguments_(pattern[1]) ._nodes_([sequence]) }