[kelbt-users] make calc2.kl example a *counting* calculator
Elijah Epifanov
elijah.epifanov at gmail.com
Mon Jan 12 20:26:05 UTC 2009
diff -Naur calc2eof.kl calc2c.kl
--- calc2eof.kl 2009-01-12 23:23:01.000000000 +0300
+++ calc2c.kl 2009-01-12 23:21:30.000000000 +0300
@@ -1,11 +1,9 @@
-/*
- * @LANG: c
- */
-
#include <stdio.h>
#include <stdlib.h>
-struct Token { };
+struct Token {
+ double value;
+};
struct LangEl;
%%{
@@ -33,14 +31,13 @@
%% write token_defs;
-
%%{
parser Parser;
# Expect an expression.
start: E try {
- printf( "start = E;\n" );
+ printf( "start = E(%f);\n", $1->res );
};
# Expressions returns a float result;
@@ -50,10 +47,12 @@
# Top level of expressions support addition.
E: E tok_plus F try {
- printf( "E = E tok_plus F;\n" );
+ $$->res = $1->res + $3->res;
+ printf( "E(%f) = E(%f) tok_plus F(%f);\n", $$->res, $1->res, $3->res);
};
E: F try {
- printf( "E = F;\n" );
+ $$->res = $1->res;
+ printf( "E(%f) = F(%f);\n", $$->res, $1->res);
};
# Factor returns a float result;
@@ -63,10 +62,12 @@
# Second level supports multiplication.
F: tok_number tok_mult F try {
- printf( "F = tok_number tok_mult F;\n" );
+ $$->res = $1->value * $3->res;
+ printf( "F(%f) = tok_number(%f) tok_mult F(%f);\n", $$->res,
$1->value, $3->res);
};
-F: tok_number try {
- printf( "F = tok_number;\n" );
+F: tok_number try {
+ $$->res = $1->value;
+ printf( "F(%f) = tok_number(%f);\n", $$->res, $1->value);
};
}%%
@@ -101,14 +102,23 @@
printf("parse error\n");
}
+void token( int tokid, double value )
+{
+ struct Token token;
+ token.value = value;
+ int result = parseLangEl( tokid, &token );
+ if ( result < 0 )
+ printf("parse error\n");
+}
+
void test0()
{
init();
- token( tok_number );
+ token( tok_number, 1 );
token( tok_plus );
- token( tok_number );
+ token( tok_number, 2 );
token( tok_mult );
- token( tok_number );
+ token( tok_number, 3 );
token( Parser_tk_eof );
finish();
printf( "%d\n", p.errCount );
@@ -116,7 +126,7 @@
void test1()
{
init();
- token( tok_number );
+ token( tok_number, 13 );
token( Parser_tk_eof );
finish();
printf( "%d\n", p.errCount );
@@ -124,15 +134,15 @@
void test2()
{
init();
- token( tok_number );
+ token( tok_number, 3 );
token( tok_plus );
- token( tok_number );
+ token( tok_number, 4 );
token( tok_plus );
- token( tok_number );
+ token( tok_number, 5 );
token( tok_plus );
- token( tok_number );
+ token( tok_number, 6 );
token( tok_mult );
- token( tok_number );
+ token( tok_number, 7 );
token( Parser_tk_eof );
finish();
printf( "%d\n", p.errCount );
@@ -155,7 +165,7 @@
void test5()
{
init();
- token( tok_number );
+ token( tok_number, 8 );
token( tok_plus );
token( Parser_tk_eof );
finish();
@@ -164,7 +174,7 @@
void test6()
{
init();
- token( tok_number );
+ token( tok_number, 9 );
token( tok_mult );
token( Parser_tk_eof );
finish();
@@ -173,10 +183,10 @@
void test7()
{
init();
- token( tok_number );
+ token( tok_number, 10 );
token( tok_mult );
- token( tok_number );
- token( tok_number );
+ token( tok_number, 11 );
+ token( tok_number, 12 );
token( Parser_tk_eof );
finish();
printf( "%d\n", p.errCount );
More information about the kelbt-users
mailing list