Difference between revisions of "GenAsm (language)"
From Mill Computing Wiki
m | |||
Line 36: | Line 36: | ||
["inline"], funcId | | ["inline"], funcId | | ||
gang | | gang | | ||
− | "(" expression ")" | | + | "(", expression, ")" | |
"begin", serial, "end" | | "begin", serial, "end" | | ||
ifClause; | ifClause; | ||
Line 51: | Line 51: | ||
boundId ::= identifier; | boundId ::= identifier; | ||
resolution ::= funcId, [widthPack]; | resolution ::= funcId, [widthPack]; | ||
− | funcId ::= | + | funcId ::= identifier; |
− | + | ||
moduleId ::= identifier; | moduleId ::= identifier; | ||
− | identifier ::= alpha, {alnum}; | + | identifier ::= [qualification], name; |
+ | qualification ::= [qualification], name, "::"; | ||
+ | name ::= alpha, {alnum}; | ||
alnum ::= decDigit | alpha; | alnum ::= decDigit | alpha; | ||
alpha ::= "_" | <"a"-"z"> | <"A"-"Z">; | alpha ::= "_" | <"a"-"z"> | <"A"-"Z">; |
Revision as of 04:04, 31 October 2014
The genAsm assembly language is a low-level dataflow language for writing programs to be executed on the Mill processors. The language is accepted by the genAsm assembler, which create ELF files suitable as input to the prelinker or specializer. The assembler is intended for use when high-level language compilers are unable to provide a desired access to Mill hardware facilities.
Syntax in EBNF:
" ... " terminal keyword or symbol ::= is defined as | alternatives [ ... ] option (zero or one times { ... } repetition (zero or more times) , sequence (in order left-to-right) ; end of definition
program ::= "module", moduleId, expDefs; serial ::= [expDef, {";", expDef}]; expDef ::= expression | definition; definition ::= functionDef; functionDef ::= ["inline"], "func", identifier, formals, [results], funcBody; funcBody ::= ":", expression | "outcall" | "forward"; formals ::= "(", [formal, {",", formal}], ")"; formal ::= widthTag, identifier; widthTag ::= "b" | "h" | "w" | "d" | "q" | "bv" | "hv" | "wv" | "dv" | "qv"; results ::= widthPack; widthPack ::= "{", [widthTag, {",", widthTag}], "}"; expression ::= [secondary] | expression, binding | expression, gang, [secondary] | expression, ["inline"], funcId, [secondary] expression, "?", expression, ":", expression; secondary ::= primary | secondary, "(", [expression, {",", expression}], ")" secondary, widthPack; primary ::= widthTag | [widthTag, ":"] number | boundId | ["inline"], funcId | gang | "(", expression, ")" | "begin", serial, "end" | ifClause; binding ::= "-:" identifier | "-:", idenPack; idenPack ::= "{", identifier, {",", identifier}, "}"; gang ::= opId ["." opId]; opId ::= identifier; ifClause ::= "if", predPart, thenPart, {elifPart}, [elsePart], "fi"; predPart ::= serial; thenPart ::= "then", serial; elifPart ::= "elif", serial; elsePart ::= "else", serial; boundId ::= identifier; resolution ::= funcId, [widthPack]; funcId ::= identifier; moduleId ::= identifier; identifier ::= [qualification], name; qualification ::= [qualification], name, "::"; name ::= alpha, {alnum}; alnum ::= decDigit | alpha; alpha ::= "_" | <"a"-"z"> | <"A"-"Z">; decDigit ::= <"0"-"9">; number ::= decimal | hexadecimal | float; decimal ::= digit, { digit }; hexadecimal ::= hexBase, hexDigit, { hexDigit } hexBase ::= "0x" | "0X" hexDigit ::= decDigit | <"a"-"f"> | <"A"-"F"> float ::= decimal, ".", [decimal], [exponent] | decimal, ["." [decimal]], exponent exponent ::= "e", [sign], decimal | "E", [sign], decimal sign ::= "+" | "-" comment ::= "//", {<char>}, <EOL> | "/*", {<char>}, "*/";