Link Search Menu Expand Document
\( % cbs-katex.sty % \newcommand{\STYLE}[2]{\htmlClass{cbs-#1}{#2}} \newcommand{\DECL}[3]{\htmlId{#1:#2}{#3}} \newcommand{\REF}[3]{\href{###1:#2}{#3}} \newcommand{\HYPER}[5]{\href{#1/#2/index.html###3:#4}{#5}} % \SHADE{MATH} can be defined to produce a shaded background to highlight % inline MATH in running text: \newcommand{\SHADE}[1]{#1} % \KEY{TEXT}, \STRING{TEXT}, \ATOM{TEXT}, \LEX{TEXT} can be used in math mode: \newcommand{\KEY}[1]{\textsf{\textit{\STYLE{Key}{#1}}}} \newcommand{\STRING}[1]{\textsf{``\texttt{#1}''}} \newcommand{\ATOM}[1]{\textsf{`\texttt{#1}'}} \newcommand{\LEX}[1]{\textsf{\STYLE{Key}{`}\texttt{#1}\STYLE{Key}{'}}} % The following commands produce ASCII characters that are treated specially by LaTeX: \newcommand{\HASH}{\char`\#} \newcommand{\DOLLAR}{\char`\$} \newcommand{\PERCENT}{\char`\%} \newcommand{\AMPERSAND}{\char`\&} \newcommand{\APOSTROPHE}{\char`\'} \newcommand{\BACKSLASH}{\char`\\} \newcommand{\CARET}{\char`\^} \newcommand{\UNDERSCORE}{\char`\_} \newcommand{\GRAVE}{\char`\`} \newcommand{\LEFTBRACE}{\char`\{} \newcommand{\RIGHTBRACE}{\char`\}} \newcommand{\TILDE}{\textasciitilde} % {\char`\~} % \NAME{name} highlights the name; % \NAMEDECL{name} declares Name.name as the target of links to name; % \NAMEREF{name} links name to the target Name.name in the current file; % \NAMEHYPER{url}{file}{name} links name to Name.name at url/file/file.pdf. % Similarly for \VAR{partvariable}, \SYN{syntaxname}, \SEM{semanticsName}, % and \SECT{sectionnumber} % The kerns in \SUB and \VAR avoid overlaps with primes: \newcommand{\SUB}[1]{_{\kern-2mu\STYLE{PartVariable}{\textsf{#1}}}} % PLAIN \newcommand{\VAR}[1]{\STYLE{PartVariable}{\textsf{\textit{#1}\kern2mu}}} \newcommand{\NAME}[1]{\STYLE{Name}{\textsf{#1}}} \newcommand{\SYN}[1]{\STYLE{SyntaxName}{\textsf{#1}}} \newcommand{\SEM}[1]{\STYLE{SemanticsName}{\textsf{#1}}} \newcommand{\SECT}[1]{\STYLE{SectionNumber}{\textsf{#1}}} % DECL \newcommand{\VARDECL}[1]{\DECL{PartVariable}{#1}{\VAR{#1}}} \newcommand{\NAMEDECL}[1]{\DECL{Name}{#1}{\NAME{#1}}} \newcommand{\SYNDECL}[1]{\DECL{SyntaxName}{#1}{\SYN{#1}}} \newcommand{\SEMDECL}[1]{\DECL{SemanticsName}{#1}{\SEM{#1}}} \newcommand{\SECTDECL}[1]{\DECL{SectionNumber}{#1}{\textsf{#1}}} % REF \newcommand{\VARREF}[1]{\REF{PartVariable}{#1}{\VAR{#1}}} \newcommand{\NAMEREF}[1]{\REF{Name}{#1}{\NAME{#1}}} \newcommand{\SYNREF}[1]{\REF{SyntaxName}{#1}{\SYN{#1}}} \newcommand{\SEMREF}[1]{\REF{SemanticsName}{#1}{\SEM{#1}}} \newcommand{\SECTREF}[1]{\REF{SectionNumber}{#1}{\SECT{#1}}} % HYPER \newcommand{\VARHYPER}[3]{\HYPER{#1}{#2}{PartVariable}{#3}{\VAR{#3}}} \newcommand{\NAMEHYPER}[3]{\HYPER{#1}{#2}{Name}{#3}{\NAME{#3}}} \newcommand{\SYNHYPER}[3]{\HYPER{#1}{#2}{SyntaxName}{#3}{\SYN{#3}}} \newcommand{\SEMHYPER}[3]{\HYPER{#1}{#2}{SemanticsName}{#3}{\SEM{#3}}} \newcommand{\SECTHYPER}[3]{\HYPER{#1}{#2}{SectionNumber}{#3}{\SECT{#3}}} % \LEFTPHRASE MATH \RIGHTPHRASE produces [[ MATH ]] with proper brackets: \newcommand{\LEFTPHRASE}{\llbracket} \newcommand{\RIGHTPHRASE}{\rrbracket} % \LEFTGROUP MATH \RIGHTGROUP produces ( MATH ) where the parentheses are % highlighted the same as keywords: \newcommand{\LEFTGROUP}{\STYLE{Key}{(}} \newcommand{\RIGHTGROUP}{\STYLE{Key}{)}} % MATH\PLUS produces a superscript + % MATH\STAR produces a superscript * % MATH\QUERY produces a superscript ? \newcommand{\PLUS}{{}^{\texttt{+}}} \newcommand{\STAR}{{}^{\texttt{*}}} \newcommand{\QUERY}{{}^{\texttt{?}}} % \RULE{& PREMISE \\ & ...}{& FORMULA ... \\ & ...} produces an inference rule % with separately aligned premises and conclusion % PREMISE % ... % ----------- % FORMULA ... % ... \newcommand{\RULE}[2] {\frac{\begin{aligned}#1\end{aligned}}{\begin{aligned}#2\end{aligned}}} % \AXIOM{& FORMULA ... \\ & ...} produces an aligned formula % % FORMULA ... % ... \newcommand{\AXIOM}[1]{\begin{aligned}#1\end{aligned}} % \TO TYPE produces => TYPE \newcommand{\TO}{\mathop{\Rightarrow}} % TERM \TRANS TERM produces TERM ---> TERM \newcommand{\TRANS}{\longrightarrow} % TERM \xrightarrow{LABEL} TERM puts the label above the long arrow % \)

Languages-beta : MiniJava-Syntax.cbs | PLAIN | PDF


\[\KEY{Language} \quad \STRING{MiniJava}\]

[The MiniJava Reference Manual]: http://www.cambridge.org/us/features/052182060X/mjreference/mjreference.html

[Modern Compiler Implementation in Java: the MiniJava Project]: http://www.cambridge.org/us/features/052182060X/

The grammar used here is mostly a transliteration of the one provided at: http://www.cambridge.org/us/features/052182060X/grammar.html (which differs in trivial ways from the one in the cited reference manual).

The rest of this file gives an overview of the MiniJava syntax. It is mostly in the form of a comment with embedded productions. The nonterminal symbols are hyperlinks to their actual specifications; similarly, section numbers (such as \(\SECTHYPER{../.}{MiniJava-Dynamics}{1}\) below) link to the corresponding specification section.

\(\SECTHYPER{../.}{MiniJava-Dynamics}{1}\) Programs

\[\begin{align*} \KEY{Syntax} \quad \VARDECL{START} : \SYNDECL{start} \ ::= \ & \ \SYNREF{program} \\ \VARDECL{P} : \SYNDECL{program} \ ::= \ & \ \SYNREF{main-class} \ \SYNREF{class-declaration}\STAR \\ \VARDECL{MC} : \SYNDECL{main-class} \ ::= \ & \ \LEX{class} \ \SYNREF{identifier} \ \LEX{{\LEFTBRACE}} \\ & \ \LEX{public} \ \LEX{static} \ \LEX{void} \ \LEX{main} \ \LEX{{(}} \ \LEX{String} \ \LEX{{[}} \ \LEX{{]}} \ \SYNREF{identifier} \ \LEX{{)}} \ \LEX{{\LEFTBRACE}} \\ & \ \SYNREF{statement} \\ & \ \LEX{{\RIGHTBRACE}} \\ & \ \LEX{{\RIGHTBRACE}} \end{align*}\]

\(\SECTHYPER{../.}{MiniJava-Dynamics}{2}\) Declarations

\[\begin{align*} \KEY{Syntax} \quad \VARDECL{CD} : \SYNDECL{class-declaration} \ ::= \ & \ \LEX{class} \ \SYNREF{identifier} \ \LEFTGROUP \LEX{extends} \ \SYNREF{identifier} \RIGHTGROUP\QUERY \ \LEX{{\LEFTBRACE}} \\ & \ \SYNREF{var-declaration}\STAR \\ & \ \SYNREF{method-declaration}\STAR \\ & \ \LEX{{\RIGHTBRACE}} \\ \VARDECL{VD} : \SYNDECL{var-declaration} \ ::= \ & \ \SYNREF{type} \ \SYNREF{identifier} \ \LEX{{;}} \\ \VARDECL{MD} : \SYNDECL{method-declaration} \ ::= \ & \ \LEX{public} \ \SYNREF{type} \ \SYNREF{identifier} \ \LEX{{(}} \ \SYNREF{formal-list}\QUERY \ \LEX{{)}} \ \LEX{{\LEFTBRACE}} \\ & \ \SYNREF{var-declaration}\STAR \\ & \ \SYNREF{statement}\STAR \\ & \ \LEX{return} \ \SYNREF{expression} \ \LEX{{;}} \\ & \ \LEX{{\RIGHTBRACE}} \\ \VARDECL{T} : \SYNDECL{type} \ ::= \ & \ \LEX{int} \ \LEX{{[}} \ \LEX{{]}} \\ \ \mid \ & \ \LEX{boolean} \\ \ \mid \ & \ \LEX{int} \\ \ \mid \ & \ \SYNREF{identifier} \\ \VARDECL{FL} : \SYNDECL{formal-list} \ ::= \ & \ \SYNREF{type} \ \SYNREF{identifier} \ \LEFTGROUP \LEX{{,}} \ \SYNREF{formal-list} \RIGHTGROUP\QUERY \end{align*}\]

\(\SECTHYPER{../.}{MiniJava-Dynamics}{3}\) Statements

\[\begin{align*} \KEY{Syntax} \quad \VARDECL{S} : \SYNDECL{statement} \ ::= \ & \ \LEX{{\LEFTBRACE}} \ \SYNREF{statement}\STAR \ \LEX{{\RIGHTBRACE}} \\ \ \mid \ & \ \LEX{if} \ \LEX{{(}} \ \SYNREF{expression} \ \LEX{{)}} \ \SYNREF{statement} \ \LEX{else} \ \SYNREF{statement} \\ \ \mid \ & \ \LEX{while} \ \LEX{{(}} \ \SYNREF{expression} \ \LEX{{)}} \ \SYNREF{statement} \\ \ \mid \ & \ \LEX{System} \ \LEX{{.}} \ \LEX{out} \ \LEX{{.}} \ \LEX{println} \ \LEX{{(}} \ \SYNREF{expression} \ \LEX{{)}} \ \LEX{{;}} \\ \ \mid \ & \ \SYNREF{identifier} \ \LEX{{=}} \ \SYNREF{expression} \ \LEX{{;}} \\ \ \mid \ & \ \SYNREF{identifier} \ \LEX{{[}} \ \SYNREF{expression} \ \LEX{{]}} \ \LEX{{=}} \ \SYNREF{expression} \ \LEX{{;}} \end{align*}\]

\(\SECTHYPER{../.}{MiniJava-Dynamics}{4}\) Expressions

\[\begin{align*} \KEY{Syntax} \quad \VARDECL{E} : \SYNDECL{expression} \ ::= \ & \ \SYNREF{expression} \ \LEX{{\AMPERSAND}{\AMPERSAND}} \ \SYNREF{expression} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{<}} \ \SYNREF{expression} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{+}} \ \SYNREF{expression} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{-}} \ \SYNREF{expression} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{*}} \ \SYNREF{expression} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{[}} \ \SYNREF{expression} \ \LEX{{]}} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{.}} \ \LEX{length} \\ \ \mid \ & \ \SYNREF{expression} \ \LEX{{.}} \ \SYNREF{identifier} \ \LEX{{(}} \ \SYNREF{expression-list}\QUERY \ \LEX{{)}} \\ \ \mid \ & \ \SYNREF{integer-literal} \\ \ \mid \ & \ \LEX{true} \\ \ \mid \ & \ \LEX{false} \\ \ \mid \ & \ \SYNREF{identifier} \\ \ \mid \ & \ \LEX{this} \\ \ \mid \ & \ \LEX{new} \ \LEX{int} \ \LEX{{[}} \ \SYNREF{expression} \ \LEX{{]}} \\ \ \mid \ & \ \LEX{new} \ \SYNREF{identifier} \ \LEX{{(}} \ \LEX{{)}} \\ \ \mid \ & \ \LEX{{!}} \ \SYNREF{expression} \\ \ \mid \ & \ \LEX{{(}} \ \SYNREF{expression} \ \LEX{{)}} \\ \VARDECL{EL} : \SYNDECL{expression-list} \ ::= \ & \ \SYNREF{expression} \ \LEFTGROUP \LEX{{,}} \ \SYNREF{expression-list} \RIGHTGROUP\QUERY \end{align*}\]

\(\SECTHYPER{../.}{MiniJava-Dynamics}{5}\) Lexemes

\[\begin{align*} \KEY{Lexis} \quad \VARDECL{ID} : \SYNDECL{identifier} \ ::= \ & \ \SYNREF{letter} \ \LEFTGROUP \SYNREF{letter} \mid \SYNREF{digit} \mid \LEX{{\UNDERSCORE}} \RIGHTGROUP\STAR \\ \VARDECL{IL} : \SYNDECL{integer-literal} \ ::= \ & \ \SYNREF{digit}\PLUS \\ \SYNDECL{letter} \ ::= \ & \ \LEX{a} {-} \LEX{z} \mid \LEX{A} {-} \LEX{Z} \\ \SYNDECL{digit} \ ::= \ & \ \LEX{0} {-} \LEX{9} \end{align*}\]

\(\SECT{6}\) Disambiguation

The mixture of CBS and SDF below specifies how MiniJava texts are to be disambiguated by parsers generated from the above grammar.

The specified rules are adequate to disambiguate all the example programs provided at https://www.cambridge.org/us/features/052182060X/#progs.

\(\KEY{Syntax SDF}\)

context-free syntax
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{*}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\) {left}
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{+}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\) {left}
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{-}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\) {left}
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{<}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\) {non-assoc}
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{\AMPERSAND}{\AMPERSAND}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\) {left}

context-free priorities
{
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{.}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{identifier} \ \LEX{{(}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression-list}\QUERY \ \LEX{{)}}}\)
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{[}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{]}}}\)
} <0> >
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \LEX{{!}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)
>
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{*}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)
> {
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{+}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{-}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)
} >
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{<}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)
>
\(\SHADE{\quad\SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ ::= \ \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression} \ \LEX{{\AMPERSAND}{\AMPERSAND}} \ \SYNHYPER{../.}{MiniJava-Dynamics}{expression}}\)

\(\KEY{Lexis SDF}\)

lexical restrictions
\(\SHADE{\SYNHYPER{../.}{MiniJava-Dynamics}{identifier}}\) -/- [a-zA-Z0-9_]
\(\SHADE{\SYNHYPER{../.}{MiniJava-Dynamics}{integer-literal}}\) -/- [0-9]

lexical syntax
\(\SHADE{\SYNHYPER{../.}{MiniJava-Dynamics}{identifier}}\) = \(\SHADE{\SYNREF{reserved-id}}\) {reject}

\[\begin{align*} \KEY{Lexis} \quad \SYNDECL{reserved-id} \ ::= \ & \ \LEX{String} \\ \ \mid \ & \ \LEX{System} \\ \ \mid \ & \ \LEX{boolean} \\ \ \mid \ & \ \LEX{class} \\ \ \mid \ & \ \LEX{else} \\ \ \mid \ & \ \LEX{extends} \\ \ \mid \ & \ \LEX{false} \\ \ \mid \ & \ \LEX{if} \\ \ \mid \ & \ \LEX{int} \\ \ \mid \ & \ \LEX{length} \\ \ \mid \ & \ \LEX{main} \\ \ \mid \ & \ \LEX{new} \\ \ \mid \ & \ \LEX{out} \\ \ \mid \ & \ \LEX{println} \\ \ \mid \ & \ \LEX{public} \\ \ \mid \ & \ \LEX{return} \\ \ \mid \ & \ \LEX{static} \\ \ \mid \ & \ \LEX{this} \\ \ \mid \ & \ \LEX{true} \\ \ \mid \ & \ \LEX{void} \end{align*}\]