Table of Contents
HipHop Formal Syntax
☆ Formal syntax
<Expression> → ... | <HHExprStatement>
<HHExprStatement> → hiphop <HHStatement>
<HHStatement> → <HHPragma>
| <HHModule>
| <HHInterface>
| <HHSeq>
| <HHLet>
| <HHSignal>
| <HHHalt>
| <HHFork>
| <HHEmit>
| <HHSustain>
| <HHAbort>
| <HHWeakabort>
| <HHSuspend>
| <HHLoop>
| <HHAsync>
| <HHRun>
| <HHEvery>
| <HHDo>
| <HHIf>
| <HHTrap>
| <HHBreak>
| <HHYield>
| <HHAwait>
| <HHDollarExpression>
| <HHExpression> ;
<HHPragma> → pragma { <Statement> }
<HHBlock> → {}
| { <HHStatement> }
| { <HHStatement> ... <HHStatement> }
<HHModule> → module <HHMachineModule>
<HHMachineModule> → [ <Identifier> ] [implements <MirrorIntfList>] ( <FormalVarList> ) { <FormalSignalList> <HHStatement>+ }
<HHInterface> → interface [ <Identifier> ] [extends <IntfList>] { <FormalSignalList> }
<MirrorIntfList> → [mirror] <Intf>, ... [mirror] <Intf>
<IntfList> → <Intf>, ... <Intf>
<Intf> → <HHDollarIdent>
<FormalVarList> → | <FormalVar>, ... <FormalVar>
<FormalVar> → <Identifier> | <Identifier> = <Expression>
<FormalSignalList> → | <GlobalSignal>, ... <GlobalSignal>
<GlobalSignal> → <Direction> <Signal>, ... <Signal>
| <Direction> "..." <Identifier>, ..., <Identifier> <SignalAttr>
| <Direction> "..." <HHDollarExpression> <SignalAttr>
<Direction> → | in | out | inout
<Signal> → <Identifier> <SignaAttr>
<SignalAttr> ->
| <Combine>
| = <HHExpression> <Combine>
| = <HHExpression> <Combine> transient
| = <HHExpression> transient
<Combine> → | combine <Expression>
<HHAwait> → await <HHDelay>
<HHExpression> → <Expression>
| <Identifier>.now
| <Identifier>.pre
| <Identifier>.nowval
| <Identifier>.preval
| <Identifier>.signame
| this[<Expression>].now
| this[<Identifier>].pre
| this[<Identifier>].nowval
| this[<Identifier>].preval
| this[<Identifier>].signame
<HHDelay> → ( <HHExpression> )
| count( <HHExpression>, <HHExpression> )
| immediate( <HHExpression> )
<HHLet> → let <Declaration> ... <Declaration>
<Declaration> → <Identifier> | <Identifier> = <HHExpression>
<HHSignal> → signal <Signal> | signal [mirror] <Intf>
<HHalt> → halt
<HHSeq> → [ <String> ] <HHBlock>
<HHFork> → fork [ <String> ] <HHBlock> [ par <HHBlock> ... par <HHBlock> ]
| fork <HHDollarExpression>
<HHSignalName> → <Identifier>
| <HHDollarExpression>
<HHEmit> → emit <HHSignalName>()
| emit <HHSignalName> ( <HHExpression> )
<HHSustain> → sustain <HHSignalName>()
| sustain <HHSignalName> ( <HHExpression> )
<HHAbort> → abort <HHDelay> <HHBlock>
<HHWeakabort> → weakabort <HHDelay> <HHBlock>
<HHSuspend> → suspend <HHDelay> <HHBlock>
| suspend from <HHDelay> to <HHDelay> <HHBlock>
| suspend from <HHDelay> to <HHDelay> emit <Identifier>() <HHBlock>
| suspend toggle <HHDelay> <HHBlock>
| suspend toggle <HHDelay> emit <Identifier>() <HHBlock>
<HHLoop> → loop <HHBlock>
<HHAsync> → async ( [ <HHSignalName> ] ) HHBLock <HHAsyncKill> <HHAsyncSuspend> <HHAsyncResume>
<HHAsyncKill> → | kill <HHBlock>
<HHAsyncSuspend> → | suspend <HHBlock>
<HHAsyncResume> → | resume <HHBlock>
<HHRun> → run <HHRunModule> ( <HHRunExpressions> ) { <HHRunSigs> }
| run <HHRunModule> ( <HHRunExpressions> ) <HHDollarExpression>
<HHRunModule> → <Ident> | <HHDollarExpression>
<HHRunExpressions> → | | <HHExpression>, ... <HHExpression>
<HHRunSigs> → | <HHRunSig> , ... <HHRunSig>
<HHRunSig> → <Identifier>
| <Identifier> as <Identifier>
| *
| +
<HHEvery> → every <HHDelay> <HHBlock>
<HHDo> → do <HHBlock> every <HHDelay>
<HHIf> → if( <HHExpression> ) <HHStatement>
| if( <HHExpression> ) <HHStatement> else <HHStatement>
<HHTrap> → <HHLabel> : <HHStatement>
<HHbreak> → break <HHLabel>
<HHYield> → yield
<HHDollarExpression> → ${ <Expression> }
<HHDollarIdent> → <HHDollarExpression> | <Identifier>