Core Function Parser Engine
From Sputnik Wiki
[Rules/Terminals] : TokenName
Class name
{
Function __Construct ( <Parameters> ... )
{
statements
...
}
}
Description
Parse text and have classes created and returned to you.
Terminal
Entered like:
Terminal("Name")
<pre>
Defines this class as the object to be created when this Terminal is found in the source code
=== Rule ===
Entered like:
<pre>
Rule("<rule> ::= <bla bla bla>")
<pre>
Defines this class as the object to be created when this Rule is found in the source code
=== Class ===
The class object to be created
=== Function ===
Optional; If the __Construct is made then the Tokens will be linked to that class otherwise they may be null etc.
=== Remarks ===
This makes use of the [http://en.wikipedia.org/wiki/GOLD_%28parser%29 GoldParser].
Its purpose is to provide a way to parse more complex files than simply regex alone can allow.
To make use of this you must first created a grammar file (.CGT) in GoldParser builder then create all classes for use (Simply opening parser without the rules/terminals will tell you what it requires to work) then use the Parser() function to spawn a new parser and Parse() to read text and parse it.
See example below
=== Example ===
<syntaxhighlight lang="sputnik">
[
Terminal("(EOF)")
Terminal("(Error)")
Terminal("(Whitespace)")
Terminal("(")
Terminal(")")
] : SpecialToken
Class myUselessTerminals{};
[Terminal("Float")] : SpecialToken
Class myFloat
{
my $value;
Function __Construct( $Value )
{
$this->$value = (Double)ObjToVar($Value);
}
};
[Terminal("Integer")] : SpecialToken
Class myInteger
{
my $value;
Function __Construct( $Value )
{
$this->$value = (Double)ObjToVar($Value);
}
};
[Rule("<Negate Exp> ::= ~'-' <Value>")] : SpecialToken
Class Negate
{
my $value;
Function __Construct( $value )
{
$this->$value = -(TokenClass($value)->$value);
}
};
[Terminal("+")] : SpecialToken
Class opPlus
{
my $value;
Function __Construct( ) { }
Function Calculate(&$Left, $Right)
{
return TokenClass($Left)->$value += TokenClass($Right)->$value;
}
};
[Terminal("-")] : SpecialToken
Class opMinus
{
my $value;
Function __Construct( ) { }
Function Calculate(&$Left, $Right)
{
return TokenClass($Left)->$value -= TokenClass($Right)->$value;
}
};
[Terminal("*")] : SpecialToken
Class opMult
{
my $value;
Function __Construct( ) { }
Function Calculate(&$Left, $Right)
{
return TokenClass($Left)->$value *= TokenClass($Right)->$value;
}
};
[Terminal("/")] : SpecialToken
Class opDivide
{
my $value;
Function __Construct( ) { }
Function Calculate(&$Left, $Right)
{
return TokenClass($Left)->$value /= TokenClass($Right)->$value;
}
};
[
Rule("<Expression> ::= <Expression> '+' <Mult Exp>")
Rule("<Expression> ::= <Expression> '-' <Mult Exp>")
Rule("<Mult Exp> ::= <Mult Exp> '/' <Negate Exp>")
Rule("<Mult Exp> ::= <Mult Exp> '*' <Negate Exp>")
] : SpecialToken
Class Operation
{
my $value;
Function __Construct( $Left, $OP, $Right )
{
$this->$value = TokenClass($OP)->Calculate(&$Left, $Right);
}
};
my $Trims = array( "<Value> ::= '(' <Expression> ')'" => "<Expression>" );
my $Parser = Parser("Test.cgt", "SpecialToken", $Trims);
println("Enter expressions to be parsed.");
println("Example 100+(50/2)");
while(true)
{
my $Input = input("> ");
try
{
if(isEmpty($Input))
{
println("You must type an expression to parse");
continue;
}
my $ReturnToken = Parse($Parser, $Input);
if(isToken($ReturnToken))
{
println(TokenClass($ReturnToken)->$Value);
}
}
catch (Exception $e)
{
println("Error: " . $e->getMessage());
}
}
</syntaxhighlight>
Here is the Grammar file to use with the above source code
<pre>
"Name" = 'Calculator Sample Grammar'
"Author" = 'Arsène von Wyss'
"Version" = '0.1'
"About" = 'Sample grammar for simple calculation expressions'
"Start Symbol" = <Expression>
"Case Sensitive" = false
Integer = {Digit}+
Float = {Digit}*'.'{Digit}+([Ee][+-]?{Digit}+)?
<Expression> ::= <Expression> '+' <Mult Exp>
| <Expression> '-' <Mult Exp>
| <Mult Exp>
<Mult Exp> ::= <Mult Exp> '*' <Negate Exp>
| <Mult Exp> '/' <Negate Exp>
| <Negate Exp>
<Negate Exp> ::= '-' <Value>
| <Value>
<Value> ::= Integer
| Float
| '(' <Expression> ')'