package de.monticore.lang.monticar; grammar CNNArch extends de.monticore.lang.math.Math { CNNArchCompilationUnit = Architecture; symbol scope Architecture = "architecture" name:Name& "{" declarations:ArchDeclaration* body:ArchBody "}"; interface ArchDeclaration; interface ArchitectureElement; interface Variable; IODeclaration implements ArchDeclaration = "def" (in:"input" | out:"output") type:ArchType Name& (ArrayDeclaration)?; ArchType implements Type = ElementType "^" Shape; Shape = "{" (Dimension || ",")+ "}"; Dimension = IOVariable | intLiteral:UnitNumberResolution; IOVariable implements Variable = Name&; Constant implements Variable = Name& "=" rhs:ArchSimpleExpression; MethodDeclaration implements ArchDeclaration = "def" Name& "(" parameters:(Parameter || ",")* ")" "{" body:ArchBody "}"; Parameter implements Variable = Name& ("=" default:ArchSimpleExpression)?; scope ArchBody = elements:(ArchitectureElement || "->")*; IOLayer implements ArchitectureElement = Name& ("[" index:ArchSimpleExpression "]")?; MethodLayer implements ArchitectureElement = Name& "(" arguments:(Argument || ",")* ")"; Argument = Name "=" rhs:ArchExpression; ParallelLayer implements ArchitectureElement = "(" groups:ArchBody "|" groups:(ArchBody || "|")+ ")"; ArrayAccessLayer implements ArchitectureElement = "[" index:ArchSimpleExpression "]"; ArchExpression = (expression:ArchSimpleExpression | sequence:ArchValueSequence); interface ArchValueSequence; ArchParallelSequence implements ArchValueSequence = "[" parallelValues:(ArchSerialSequence || "|")* "]"; ArchSerialSequence = serialValues:(ArchSimpleExpression || "->")+; ArchValueRange implements ArchValueSequence = start:ArchSimpleExpression (serial:"->" | parallel:"|") ".." (serial2:"->" | parallel2:"|") end:ArchSimpleExpression; ArchSimpleExpression = (arithmeticExpression:MathArithmeticExpression | booleanExpression:MathBooleanExpression | tupleExpression:TupleExpression); TupleExpression implements MathExpression = "(" expressions:MathArithmeticExpression "," expressions:(MathArithmeticExpression || ",")* ")"; }