IntCodeGrammar.tioga
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Bill Tyler July 8, 1992 2:44 pm PDT
IntCode Language Definition - As extracted from an analysis of the module
ParseIntCodeImpl.mesa
This grammar describes legal Mimosa intermediate code in its ASCII form, as nearly as I can determine from a reading of the intcode parser. That is, it is the result of reverse engineering. The names used in the grammar are meaningful, for the most part, and the intention is that this grammar will help compiler writers who need to deal with the intermediate code.
Notation: The notation is a modified and extended form of BNF. Syntactic variables
are written as sequences of upper and lower case letters and digits. Character
constants are enclosed in single quotes. Parentheses are used for grouping. A variable,
constant, or parenthesized group may be followed by a question mark, indicating that
it is optional, or by an asterisk signifying that it may occur zero or any positive
number of times. The vertical stroke separates alternatives. A subexpression may be
preceded by a label consisting of an indentifier followed by a colon. The label
generally is some sort of comment on the use of the following subexpression.
IntCode = Node *
Node = '{' INT[-1] ( varNode | constNode | blockNode | enableNode
| declNode | assignNode | condNode | labelNode
| gotoNode | applyNode | lambdaNode | returnNode
| operNode | machineCodeNode | moduleNode
| sourceNode | commentNode ) ? '}'
varNode = 'var' variableFlags variableId location
variableFlags = ('T' | 't' | 'F' | 'f' ) *
variableId = INT[0]
location = '(' ( systemLocation | globalVarLocation | localVarLocation
| registerLocation | linkLocation | stackLocation
| derefLocation | indexedLocation | fieldLocation
| xfieldLocation | upLevelLocation | compositeLocation
| escapeLocation | dummyLocation ) ')'
constNode = 'const' (wordConst | bytesConst | refLiteralConst | numLiteral
blockNode = 'block' nodeList
nodeList = node *
enableNode = 'enable' handlerContext:node handlerProc:node nodeList
declNode = 'decl' var init:node
assignNode = 'assign' lhs:var rhs:node
condNode = 'cond' ( '(' 'test' tests:nodeList ')' body:node? ) *
var = varNode
labelNode = 'label' label node?
label = '%' INT
gotoNode = 'goto' label:label labNode:node ?
applyNode = 'apply' proc:node args:nodeList handler:('!' context:node proc:node)?
lambdaNode = 'lambda' parent:label? var? ( 'outer' | 'inner' | 'install'
| 'init' | 'catch' | 'scope'
| 'fork' )?
bitsOut:INT? formalArgs:varList body:nodeList
varList = '(' var* ')'
returnNode = 'return' nodeList
operNode = 'oper' operRep
operRep = 'arith' ArithClass ( 'add' | 'sub' | 'mul' | 'div' | 'mod'
| 'pow' | 'abs' | 'neg' | 'min' | 'max' )
| 'boolean' ( 'and' | 'not' | 'or' | 'xor' ) INT[defaultBits]
| 'code' label INT FLAG
| 'convert' to:ArithClass from:ArithClass
| 'check' ArithClass ('eq' | 'lt' | 'le' | 'ne' | 'ge' | 'gt')
| 'compare' ArithClass ('eq' | 'lt' | 'le' | 'ne' | 'ge' | 'gt')
| 'mesa' ( 'addr' | 'all' | 'equal' | 'notEqual' | 'nilck'
| 'alloc' | 'free' | 'fork' | 'join'
| 'monitorEntry' | 'monitorExit'
| 'notify' | 'broadcast' | 'wait'
| 'unnamedError' | 'unwindError' | 'abortedError'
| 'uncaughtError' | 'boundsError' | 'narrowFault'
| 'signal' | 'error' | 'unwind' | 'resume'
| 'reject' | 'copyGlobal' | 'startGlobal'
| 'restartGlobal' | 'stopGlobal' | 'checkInit'
| 'globalFrame'
) INT[]
| 'cedar' ( 'simpleAssign' | 'simpleAssignInit' | 'complexAssign'
| 'complexAssignInit' | 'new' | 'code' | 'narrow'
| 'referentType' | 'procCheck'
)
INT[]
| 'escape' ID INT[]
ArithClass = ( signed:('s' | 'S')
| unsigned:('u' | 'U')
| address:('a' | 'A')
| real:('r' | 'R')
| ('x' | 'X') INT[ORD[LAST[ArithClassKind]]] )
precision:INT[defaultBits]? checked:FLAG?
machineCodeNode = 'machineCode' bytes
bytes = ropeLiteral
moduleNode = 'module' vars:varList procs:NodeList
sourceNode = 'source' sourceRange nodeList
sourceRange = (start:INT (chars:INT fileNum:INT?) ? ) ?
commentNode = 'comment' msg:bytes
systemLocation = 'system' ID
globalVarLocation = 'globalVar' ID
localVarLocation = 'localVar' ID label
registerLocation = 'register' ID
linkLocation = 'link' ID
stackLocation = 'stack' offset:INT[]
derefLocation = 'deref' node align:INT[defaultBits]
indexedLocation = 'indexed' base:node index:node
fieldLocation = 'field' offset:INT[] node
xfieldLocation = 'xfield' offset:INT[] node
upLevelLocation = 'upLevel' link:var reg:var format:ID
compositeLocation = 'composite' list:nodeList
escapeLocation = 'escape' id:ID offset:INT[] base:node
dummyLocation = 'dummy'