wisent: Example
2.2 Example
===========
Here is an example to parse simple infix arithmetic expressions. See
(bison)Infix Calc, in the Bison manual for details.
'(
;; Terminals
(NUM)
;; Terminal associativity & precedence
((nonassoc ?=)
(left ?- ?+)
(left ?* ?/)
(left NEG)
(right ?^))
;; Rules
(input
((line))
((input line)
(format "%s %s" $1 $2))
)
(line
((?;)
(progn ";"))
((exp ?;)
(format "%s;" $1))
((error ?;)
(progn "Error;")))
)
(exp
((NUM)
(string-to-number $1))
((exp ?= exp)
(= $1 $3))
((exp ?+ exp)
(+ $1 $3))
((exp ?- exp)
(- $1 $3))
((exp ?* exp)
(* $1 $3))
((exp ?/ exp)
(/ $1 $3))
((?- exp) [NEG]
(- $2))
((exp ?^ exp)
(expt $1 $3))
((?\( exp ?\))
(progn $2))
)
)
In the bison-like “WY” format (Wisent Semantic) the grammar
looks like this:
%token <number> NUM
%nonassoc '=' ;; comparison
%left '-' '+'
%left '*' '/'
%left NEG ;; negation--unary minus
%right '^' ;; exponentiation
%%
input:
line
| input line
(format "%s %s" $1 $2)
;
line:
';'
{";"}
| exp ';'
(format "%s;" $1)
| error ';'
{"Error;"}
;
exp:
NUM
(string-to-number $1)
| exp '=' exp
(= $1 $3)
| exp '+' exp
(+ $1 $3)
| exp '-' exp
(- $1 $3)
| exp '*' exp
(* $1 $3)
| exp '/' exp
(/ $1 $3)
| '-' exp %prec NEG
(- $2)
| exp '^' exp
(expt $1 $3)
| '(' exp ')'
{$2}
;
%%