line cleaning -- arglists are broken broken

This commit is contained in:
Jeremy Ashkenas 2009-12-13 17:23:10 -05:00
parent 8e9d637985
commit f51972a421
2 changed files with 92 additions and 83 deletions

View File

@ -2,37 +2,45 @@
# Return
# Case
square: x => x * x.
# Functions:
# square: x => x * x.
#
# sum: x, y => x + y.
#
# odd: x => x % 2 is 0.
#
# even: x => x % 2 aint 0.
#
# run_loop: =>
# fire_events(e => e.stopPropagation().)
# listen()
# wait().
#
# # Objects:
# object_literal: {one: 1, two: 2, three: 3}
#
# multiline_object: {
# pi: 3.14159
# list: [1, 2, 3, 4]
# three: 3
# inner_obj: {
# freedom: => _.freedom().
# }
# }
#
# # Arrays:
# stooges : [{moe: 45}, {curly: 43}, {larry: 46}]
sum: x, y => x + y.
arithmetic : [one, two, three, four]
odd: x => x % 2 is 0.
even: x => x % 2 aint 0.
object_literal: {one: 1, two: 2, three: 3}
multiline_object: {
pi: 3.14159
list: [1, 2, 3, 4]
three: 3
inner_obj: {
freedom: => _.freedom().
}
}
run_loop: =>
fire_events(e => e.stopPropagation().)
listen()
wait().
if submarine.shields_up
full_speed_ahead()
weapons.fire_torpedos()
else
run_away().
eldest: if 25 > 21 then liz else marge.
#
# if submarine.shields_up
# full_speed_ahead()
# weapons.fire_torpedos()
# else
# run_away().
#
# eldest: if 25 > 21 then liz else marge.

109
grammar.y
View File

@ -34,16 +34,16 @@ rule
# All parsing will end in this rule, being the trunk of the AST.
Root:
/* nothing */ { result = Nodes.new([]) }
| Expressions { result = val[0] }
/* nothing */ { result = Nodes.new([]) }
| Expressions { result = val[0] }
;
# Any list of expressions or method body, seperated by line breaks.
Expressions:
Expression { result = Nodes.new(val) }
| Expressions Terminator Expression { result = val[0] << val[2] }
| Expressions Terminator { result = Nodes.new([val[0]]) }
| Terminator Expressions { result = Nodes.new([val[1]]) }
Expression { result = Nodes.new(val) }
| Expressions Terminator Expression { result = val[0] << val[2] }
| Expressions Terminator { result = Nodes.new([val[0]]) }
| Terminator Expressions { result = Nodes.new([val[1]]) }
;
# All types of expressions in our language
@ -67,87 +67,88 @@ rule
# All hard-coded values
Literal:
NUMBER { result = LiteralNode.new(val[0]) }
| STRING { result = LiteralNode.new(val[0]) }
| TRUE { result = LiteralNode.new(true) }
| FALSE { result = LiteralNode.new(false) }
| NULL { result = LiteralNode.new(nil) }
NUMBER { result = LiteralNode.new(val[0]) }
| STRING { result = LiteralNode.new(val[0]) }
| TRUE { result = LiteralNode.new(true) }
| FALSE { result = LiteralNode.new(false) }
| NULL { result = LiteralNode.new(nil) }
;
# Assign to a variable
Assign:
Variable ":" Expression { result = AssignNode.new(val[0], val[2]) }
Variable ":" Expression { result = AssignNode.new(val[0], val[2]) }
;
# Assignment within an object literal.
AssignObj:
IDENTIFIER ":" Expression { result = AssignNode.new(val[0], val[2], :object) }
IDENTIFIER ":" Expression { result = AssignNode.new(val[0], val[2], :object) }
;
# Arithmetic and logical operators
# For Ruby's Operator precedence, see:
# https://www.cs.auckland.ac.nz/references/ruby/ProgrammingRuby/language.html
Operation:
'!' Expression { result = OpNode.new(val[0], val[1]) }
| '-' Expression = UMINUS { result = OpNode.new(val[0], val[1]) }
| NOT Expression { result = OpNode.new(val[0], val[1]) }
'!' Expression { result = OpNode.new(val[0], val[1]) }
| '-' Expression = UMINUS { result = OpNode.new(val[0], val[1]) }
| NOT Expression { result = OpNode.new(val[0], val[1]) }
| Expression '*' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '/' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '%' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '*' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '/' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '%' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '+' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '-' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '+' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '-' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '<=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '<' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '>' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '>=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '<=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '<' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '>' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '>=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '==' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '!=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression IS Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression AINT Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '==' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '!=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression IS Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression AINT Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '&&' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '||' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression AND Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression OR Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '&&' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '||' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression AND Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression OR Expression { result = OpNode.new(val[1], val[0], val[2]) }
# Add ternary?
| Expression '-=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '+=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '/=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '*=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '-=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '+=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '/=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
| Expression '*=' Expression { result = OpNode.new(val[1], val[0], val[2]) }
# Add ||= &&=
;
# Method definition
Code:
"=>" Expressions "." { result = CodeNode.new([], val[1]) }
"=>" Expressions "." { result = CodeNode.new([], val[1]) }
| ParamList
"=>" Expressions "." { result = CodeNode.new(val[0], val[2]) }
"=>" Expressions "." { result = CodeNode.new(val[0], val[2]) }
;
ParamList:
/* nothing */ { result = [] }
| IDENTIFIER { result = val }
| ParamList "," IDENTIFIER { result = val[0] << val[2] }
/* nothing */ { result = [] }
| IDENTIFIER { result = val }
| ParamList "," IDENTIFIER { result = val[0] << val[2] }
;
Variable:
IDENTIFIER { result = VariableNode.new(val) }
| Variable PROPERTY_ACCESS IDENTIFIER { result = val[0] << val[2] }
IDENTIFIER { result = VariableNode.new(val) }
| Variable PROPERTY_ACCESS
IDENTIFIER { result = val[0] << val[2] }
;
Object:
"{" "}" { result = ObjectNode.new([]) }
| "{" AssignList "}" { result = ObjectNode.new(val[1]) }
"{" "}" { result = ObjectNode.new([]) }
| "{" AssignList "}" { result = ObjectNode.new(val[1]) }
| "{" Terminator AssignList
Terminator "}" { result = ObjectNode.new(val[2]) }
Terminator "}" { result = ObjectNode.new(val[2]) }
;
AssignList:
@ -169,22 +170,22 @@ rule
# A list of arguments to a method call.
ArgList:
/* nothing */ { result = [] }
| Expression { result = val }
| ArgList "," Expression { result = val[0] << val[2] }
/* nothing */ { result = [] }
| Expression { result = val }
| ArgList "," Expression { result = val[0] << val[2] }
;
If:
IF Expression
THEN Expression "." { result = TernaryNode.new(val[1], val[3]) }
THEN Expression "." { result = TernaryNode.new(val[1], val[3]) }
| IF Expression Terminator
Expressions "." { result = IfNode.new(val[1], val[3]) }
Expressions "." { result = IfNode.new(val[1], val[3]) }
| IF Expression
THEN Expression
ELSE Expression "." { result = TernaryNode.new(val[1], val[3], val[5]) }
ELSE Expression "." { result = TernaryNode.new(val[1], val[3], val[5]) }
| IF Expression Terminator
Expressions Terminator
ELSE Expressions "." { result = IfNode.new(val[1], val[3], val[6]) }
ELSE Expressions "." { result = IfNode.new(val[1], val[3], val[6]) }
;
end