Juliet Programming Language Specification

Note: This document is a little out of date... look at examples to see the language in use.


Author....... Kevin P. Albrecht
Version...... 1.00
Date......... 4 Feb 2004

Identifiers

Identifiers (variables, labels, etc.) must begin with one
of the follwing characters:

  abcdefghijklmnopqrstuvwxyz
  ABCDEFGHIJKLMNOPQRSTUVWXYZ_

The rest of the identifier can be any of the characters
below:

  0123456789
  abcdefghijklmnopqrstuvwxyz
  ABCDEFGHIJKLMNOPQRSTUVWXYZ_  

Routines

Routine calling:
(the parentheses can be omitted when the routine is alone on a line)
  NAME
  NAME ARG1, ARG2, ...
  NAME (ARG1, ARG2, ...)

There must be a "main" routine

Routines can be recursive

rout NAME { :TYPE } { ( ARGUMENT:TYPE { , ... } ) }
  CODE
  { return { EXP } }

Exiting

to immediately terminate the program, use the following routine from
"lib.jul"

exit

Scope

scope is defined by indentation, as in python

  indent   example
  ------   -------
  0        printn "Hello, World!"
  5        {hi} printn "Hello!"
  5             c <- x 

variable names can be redefined in a deeper scope, which
  will hide the original definition of that variable.

Flow of Control

#ID	{ STATEMENT }  line label called ID
goto ID            goto the line labeled with ID

Warning (goto considered harmful!):
  Using "goto" to transfer control to a different routine can
  cause major problems.  Gotos should only be used to move within
  the routine 

loop BOOLEAN_EXP
  BLOCK

cond _boolean_exp_
  _block_

File Inclusion

$filename.jul
  inserts the Juliet file immediately
  filename extension can be omitted

Console I/O

(items in {} are optional):

print { EXP }
printn { EXP }

cinput
  a special string identifier that grabs a string out of the
  console; will continue prompting for input until a non-blank
  line is input

Variable Definitions

Variables are automatically initialized as follows:
  int: 0
  rat: 0.0
  str: ""

Variables cannot be used in the same statement they are defined in.
If flow-of-control causes the "def" of a variable to be
 passed over after it's original definition, the variable will
 be re-initialized

Variables are defined as follows (items in {} are optional):
  def ID:TYPE { <- EXP } { , ID:TYPE { <- EXP } } { , ... }
  where TYPE = int, rat, or str

Constants are defined as follows:
  const ID:TYPE <- EXP { , ID:TYPE <- EXP }

Type Casting

int EXP
rat EXP
str EXP

Comments

{{ single line

{ multiple line }

Literals

String:   "Hello", "23.4"
Integer:  23, -1000
Rational: 23.0

'nl' is a special string variable that contains the newline value
Rationals can store up to 6 digits in the mantissa (to the
  right of the decimal point).

Assignment

a <- b
  where a = variable
        b = expression

Logic Operators

a = b
a <> b
  (a=num & b=num) | (a=str & b=str)
  yields: rat

a < b
a > b
a <= b
a >= b
a or b
a and b
  a=num & b=num
  yields: rat

Arithmetic Operators

a + b
a - b
a * b
a / b
  a=num & b=num
  yields: if (a|b = rat) then rat
          else                int

a mod b
  a=int & b=int
  yields: int

a ^ b
  a=num & b=int
  yeilds: if a=rat, then rat
          if a=int, then int

String Operator

a & b
  a=str & b=str
  yields: str