This section defines lexical details of the Jeff language.
bool close console else false file fn if int open return true void while
while1
is an identifier but while
is not.
Examples of legal string literals:
"" "&!88" "use \n to denote a newline character" "use \" to for a quote and \\ for a backslash"
"unterminated "also unterminated \" "backslash followed by space: \ is not allowed" "bad escaped character: \a AND not terminated
&& = : , + - == > >= { < <= ( [ ! != || -- ++ ? ] << } ) ; / * >>
# this is a comment # and so is # this # and so is # this %$!#
The scanner should recognize and ignore comments (there is no COMMENT token).
For the most part, the token to produce should be self-explanatory. For
example, the
+
symbol should produce the
CROSS
token, the
-
symbol should produce the
DASH
token, etc. The set of tokens can be found in
frontend.hh
or in the switch in tokens.cpp
. The LCURLY
token refers to a left curly brace,
{
.
the RCURLY
refers to a right curly brace,
}
.
The lexical structure of Jeff is very similar to C, with a couple of small alterations:
file
,
console
,
fn
,
open
,
and close
are keywords of the language. They produce the
FILE
,
CONSOLE
,
FN
,
OPEN
,
and
CLOSE
,
tokens, respectively.WRITE
and READ
tokens, respectively.This section described the syntax of the Jeff language.
While the canonical reference for Jeff syntax is its context-free grammar, there are a couple of "standout" points which deserve special attention for their deviation from C:
int answer = 42;
is illegal in Jeff. Instead, initialization must be a separate statement, i.e. int answer; answer = 1;
.
fn : (int a, int b, int c) bool myFunction {}
bool myFunction(int a, int b, int c() { }
int i; i = 4;
is not a legal program, but
int i; fn : () void function{ i = 4; }
is legal.
ofile << "hello";
or
ifile >> var;
is legal.
file
.
open
operator is used to open a file, and uses the stream operators to indicate if the file is opened in read mode or write mode:
file f;
open << f "/tmp/writeme.txt";
file g;
open >> g "/tmp/readme.txt";
file h;
open >> h "/tmp/myfile.txt";
close h;
opens and then closes the file h
/********************************************************************* Grammar for Jeff programs ********************************************************************/ program ::= globals globals ::= globals varDecl SEMICOL | globals FN COLON fnDecl | /* epsilon */ varDecl ::= type id type ::= primType | arrayType primType ::= INT | BOOL | VOID | FILE arrayType ::= primType LBRACE INTLITERAL RBRACE fnDecl ::= LPAREN formals RPAREN type id LCURLY stmtList RCURLY | LPAREN RPAREN type id LCURLY stmtList RCURLY formals ::= formalDecl | formals COMMA formalDecl formalDecl ::= type id stmtList ::= stmtList stmt SEMICOL | stmtList blockStmt | /* epsilon */ blockStmt ::= WHILE LPAREN exp RPAREN LCURLY stmtList RCURLY | IF LPAREN exp RPAREN LCURLY stmtList RCURLY | IF LPAREN exp RPAREN LCURLY stmtList RCURLY ELSE LCURLY stmtList RCURLY stmt ::= varDecl | id ASSIGN exp | OPEN READ loc STRINGLITERAL | OPEN WRITE loc STRINGLITERAL | CLOSE loc | loc POSTDEC | loc POSTINC | loc READ loc | loc WRITE exp | RETURN exp | RETURN | callExp exp ::= exp DASH exp | exp CROSS exp | exp STAR exp | exp SLASH exp | LPAREN exp QUESTION exp COLON exp RPAREN | exp AND exp | exp OR exp | exp EQUALS exp | exp NOTEQUALS exp | exp GREATER exp | exp GREATEREQ exp | exp LESS exp | exp LESSEQ exp | NOT exp | DASH term | term callExp ::= id LPAREN RPAREN // fn call with no args | id LPAREN actualsList RPAREN // with args actualsList ::= exp | actualsList COMMA exp term ::= loc | INTLITERAL | STRINGLITERAL | TRUE | FALSE | LPAREN exp RPAREN | callExp loc ::= id | id LBRACE exp RBRACE id ::= ID | CONSOLE
This section defines details of the Jeff type system.
Any type is promotable to itself.
OperandsThe following shows the atomic operands and the types that they are assigned:
int
bool
The operators in the language are divided into the following categories:
[ ]
)=
)The type rules of the language are as follows:
logical operators and conditions are legal if and only if:
The result type is bool in legal cases, ERROR otherwise.
In all illegal cases, the result type is ERROR.
relational operations are legal if and only if:
int
The result type is bool in legal cases, ERROR otherwise.
equality operations are legal if and only if:
The result type is bool in legal cases, ERROR otherwise.
assignment operations are legal if and only if:
It is LEGAL to assign arrays of the same base type but different lengths regardless if the LHS or RHS is bigger
The result type is that of the LHS operand in legal cases, ERROR otherwise.
output (<<)
operations are legal if and only if:
int
or bool
or array byte[η]
, for any length η.
.
.
read (>>)
operations are legal if and only if:
int
bool
string
open and close
operations are legal if and only if:
file
indexing
operations are legal if and only if:
int
The result type is the base type of the array in legal cases, and ERROR otherwise.
function calls are legal if and only if:
If the identifier is not a function name, the result type is ERROR. Otherwise, it is the return type of the function even if the arguments are ill-typed.
function returns: The follow rules hold for function returns:
void
function
may not have a value.
void
function must have a value.
It is LEGAL for a non-void function to skip a return statement. For example, this code is ok:
int f() {
//I should return an int, but I don't
}