Syntax of Terms as Tokens


term-read-in --> subterm(1200) full-stop

subterm(N) --> term(M) {where M is less than or equal to N}

term(N) --> op(N,fx)
| op(N,fy)
| op(N,fx) subterm(N-1) {except the case - number}
{if subterm starts with a (, op must be followed by a space}
| op(N,fy) subterm(N) {if subterm starts with a (, op must be followed by a space}
| subterm(N-1) op(N,xfx) subterm(N-1)
| subterm(N-1) op(N,xfy) subterm(N)
| subterm(N) op(N,yfx) subterm(N-1)
| subterm(N-1) op(N,xf)
| subterm(N) op(N,yf)

term(1000) --> subterm(999) , subterm(1000)

term(0) --> functor ( arguments )
{provided there is no space between functor and the (}
| ( subterm(1200) )
| { subterm(1200) }
| list
| string
| constant
| variable

op(N,T) --> name {where name has been declared as an operator of type T and precedence N}

arguments --> subterm(999)
| subterm(999) , arguments

list --> []
| [ listexpr ]

listexpr --> subterm(999)
| subterm(999) , listexpr
| subterm(999) | subterm(999)

constant --> atom | number

number --> integer | float

atom --> name {where name is not a prefix operator}

integer --> natural-number
| - natural-number

float --> unsigned-float
| - unsigned-float

functor --> name