Advertisement
Guest User

Untitled

a guest
Feb 1st, 2013
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.14 KB | None | 0 0
  1. /*
  2. "Name"     = 'Calculator Sample Grammar'
  3. "Author"   = 'Arsène von Wyss'
  4. "Version"  = '0.1'
  5. "About"    = 'Sample grammar for simple calculation expressions'
  6.  
  7. "Start Symbol" = <Expression>
  8.  
  9. "Case Sensitive" = false
  10.  
  11. Integer = {Digit}+
  12. Float = {Digit}*'.'{Digit}+([Ee][+-]?{Digit}+)?
  13.  
  14. <Expression>  ::= <Expression> '+' <Mult Exp>
  15.                |  <Expression> '-' <Mult Exp>
  16.                |  <Mult Exp>
  17.  
  18. <Mult Exp>    ::= <Mult Exp> '*' <Negate Exp>
  19.                |  <Mult Exp> '/' <Negate Exp>
  20.                |  <Negate Exp>
  21.  
  22. <Negate Exp>  ::= '-' <Value>
  23.                |  <Value>
  24.  
  25. <Value>       ::= Integer
  26.                |  Float
  27.                |  '(' <Expression> ')'
  28. */
  29.  
  30. // Code below to use this grammar
  31.  
  32. [
  33. Terminal("(EOF)")
  34. Terminal("(Error)")
  35. Terminal("(Whitespace)")
  36. Terminal("(")
  37. Terminal(")")
  38. ] : SpecialToken
  39. Class myUselessTerminals{};
  40.  
  41. [Terminal("Float")] : SpecialToken
  42. Class myFloat
  43. {
  44.     my $value;
  45.     Function __Construct( $Value )
  46.     {
  47.         $this->$value = (Double)ObjToVar($Value);
  48.     }
  49. };
  50.  
  51. [Terminal("Integer")] : SpecialToken
  52. Class myInteger
  53. {
  54.     my $value;
  55.     Function __Construct( $Value )
  56.     {
  57.         $this->$value = (Double)ObjToVar($Value);
  58.     }
  59. };
  60.  
  61. [Rule("<Negate Exp> ::= ~'-' <Value>")] : SpecialToken
  62. Class Negate
  63. {
  64.     my $value;
  65.     Function __Construct( $value )
  66.     {
  67.         $this->$value = -(TokenClass($value)->$value);
  68.     }
  69. };
  70.  
  71. [Terminal("+")] : SpecialToken
  72. Class opPlus
  73. {
  74.     my $value;
  75.     Function __Construct( ) { }
  76.     Function Calculate(&$Left, $Right)
  77.     {
  78.         return TokenClass($Left)->$value += TokenClass($Right)->$value;
  79.     }
  80. };
  81.  
  82. [Terminal("-")] : SpecialToken
  83. Class opMinus
  84. {
  85.     my $value;
  86.     Function __Construct( ) { }
  87.     Function Calculate(&$Left, $Right)
  88.     {
  89.         return TokenClass($Left)->$value -= TokenClass($Right)->$value;
  90.     }
  91. };
  92.  
  93. [Terminal("*")] : SpecialToken
  94. Class opMult
  95. {
  96.     my $value;
  97.     Function __Construct( ) { }
  98.     Function Calculate(&$Left, $Right)
  99.     {
  100.         return TokenClass($Left)->$value *= TokenClass($Right)->$value;
  101.     }
  102. };
  103.  
  104. [Terminal("/")] : SpecialToken
  105. Class opDivide
  106. {
  107.     my $value;
  108.     Function __Construct( ) { }
  109.     Function Calculate(&$Left, $Right)
  110.     {
  111.         return TokenClass($Left)->$value /= TokenClass($Right)->$value;
  112.     }
  113. };
  114.  
  115. [
  116. Rule("<Expression> ::= <Expression> '+' <Mult Exp>")
  117. Rule("<Expression> ::= <Expression> '-' <Mult Exp>")
  118. Rule("<Mult Exp> ::= <Mult Exp> '/' <Negate Exp>")
  119. Rule("<Mult Exp> ::= <Mult Exp> '*' <Negate Exp>")
  120. ] : SpecialToken
  121. Class Operation
  122. {
  123.     my $value;
  124.     Function __Construct( $Left, $OP, $Right )
  125.     {
  126.         $this->$value = TokenClass($OP)->Calculate(&$Left, $Right);
  127.     }
  128. };
  129. my $Trims = array( "<Value> ::= '(' <Expression> ')'" => "<Expression>" );
  130. my $Parser = Parser("Test.cgt", "SpecialToken", $Trims);
  131. println("Enter expressions to be parsed.");
  132. println("Example 100+(50/2)");
  133. while(true)
  134. {
  135.     my $Input = input("> ");
  136.     try
  137.     {
  138.         if(isEmpty($Input))
  139.         {
  140.             println("You must type an expression to parse");
  141.             continue;
  142.         }
  143.         my $ReturnToken = Parse($Parser, $Input);
  144.         if(isToken($ReturnToken))
  145.         {
  146.             println(TokenClass($ReturnToken)->$Value);
  147.         }
  148.     }
  149.     catch (Exception $e)
  150.     {
  151.         println("Error: " . $e->getMessage());
  152.     }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement