# New Ticket Created by  Stephen Weeks 
# Please include the string:  [perl #49358]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=49358 >


Add math support to lolcode.

math ops are in src/builtins/math.pir
Index: MANIFEST
===================================================================
--- MANIFEST    (revision 24517)
+++ MANIFEST    (working copy)
@@ -1542,6 +1542,7 @@
 languages/lolcode/config/makefiles/root.in                  [lolcode]
 languages/lolcode/lolcode.pir                               [lolcode]
 languages/lolcode/src/builtins/say.pir                      [lolcode]
+languages/lolcode/src/builtins/math.pir                     [lolcode]
 languages/lolcode/src/builtins/var_or_function.pir          [lolcode]
 languages/lolcode/src/parser/actions.pm                     [lolcode]
 languages/lolcode/src/parser/grammar.pg                     [lolcode]
Index: languages/lolcode/config/makefiles/root.in
===================================================================
--- languages/lolcode/config/makefiles/root.in  (revision 24523)
+++ languages/lolcode/config/makefiles/root.in  (working copy)
@@ -39,6 +39,7 @@
 
 BUILTINS_PIR = \
   src/builtins/say.pir \
+  src/builtins/math.pir \
   src/builtins/var_or_function.pir
 
 # PMCS = lolcode
Index: languages/lolcode/src/builtins/math.pir
===================================================================
--- languages/lolcode/src/builtins/math.pir     (revision 0)
+++ languages/lolcode/src/builtins/math.pir     (revision 0)
@@ -0,0 +1,61 @@
+
+.sub 'SUM'
+    .param pmc x
+    .param pmc y
+    $P0 = n_add x, y
+    .return ($P0)
+.end
+
+.sub 'DIFF'
+    .param pmc x
+    .param pmc y
+    $P0 = n_sub x, y
+    .return ($P0)
+.end
+
+.sub 'PRODUKT'
+    .param pmc x
+    .param pmc y
+    $P0 = n_mul x, y
+    .return ($P0)
+.end
+
+.sub 'QUOSHUNT'
+    .param pmc x
+    .param pmc y
+    $P0 = n_div x, y
+    .return ($P0)
+.end
+
+.sub 'MOD'
+    .param num x
+    .param num y
+    $N0 = mod x, y
+    .return ($N0)
+.end
+
+.sub 'BIGGR'
+    .param pmc x
+    .param pmc y
+    $I0 = islt x, y
+    if $I0 goto y_biggr
+    .return (x)
+  y_biggr:
+    .return (y)
+.end
+
+.sub 'SMALLR'
+    .param pmc x
+    .param pmc y
+    $I0 = isgt x, y
+    if $I0 goto y_smallr
+    .return (x)
+  y_smallr:
+    .return (y)
+.end
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:
Index: languages/lolcode/src/parser/actions.pm
===================================================================
--- languages/lolcode/src/parser/actions.pm     (revision 24523)
+++ languages/lolcode/src/parser/actions.pm     (working copy)
@@ -124,6 +124,12 @@
     make PAST::Val.new( :value( $($<string_literal>) ), :node($/) );
 }
 
+method math($/) {
+    my $past := PAST::Op.new( :name(~$<op>), :node($/) );
+    $past.push( $($<x>) );
+    $past.push( $($<y>) );
+    make $past;
+}
 
 method identifier($/) {
     make PAST::Val.new( :value( ~$/ ), :node($/) );
Index: languages/lolcode/src/parser/grammar.pg
===================================================================
--- languages/lolcode/src/parser/grammar.pg     (revision 24523)
+++ languages/lolcode/src/parser/grammar.pg     (working copy)
@@ -61,6 +61,7 @@
 }
 
 rule value {
+    | <math>     {*}                             #= math
     | <integer>  {*}                             #= integer
     | <quote>    {*}                             #= quote
 }
@@ -70,7 +71,7 @@
 token identifier { <!keyword> $<name>=( <[a..zA..Z]> \w* ) {*} }
 
 token keyword {
-    'HOW' | 'I' | 'SAY' | 'SO' | 'U' | 'YR' | 'R' | 'AN'  | 'IF' | 'KTHXBYE'
+    'HOW' | 'I' | 'SAY' | 'SO' | 'U' | 'YR' | 'R' | 'AN'  | 'IF' | 'KTHXBYE' | 
'OF' | 'AN' | <math_word>
 }
 
 rule integer { \d+ {*} }
@@ -82,6 +83,14 @@
     {*}
 }
 
+rule math {
+    $<op>=<math_word> OF $<x>=<expression> AN $<y>=<expression>       {*}
+}
+
+token math_word {
+    SUM | DIFF | PRODUKT | QUOSHUNT | MOD | BIGGR | SMALLR
+}
+
 token ws { <!ww> [
     | ^^ \h* BTW \h \N* \n+
     | ^^ \h* OBTW .*? ^^ \h* TLDR \n+

Reply via email to