$EXTERN Lexer, Put, Arg, Open, Prout; $ENTRY Go { = >>>>; } Parser { : eTokens = ; } /* Program = [$ENTRY] Name FunctionBody Program | $EXTERN ExternList Program | пусто . */ Program { tErrorList tFunctions (Directive tPosDir 'ENTRY') (Name tPosName : eName) : eTokens = >; tErrorList tFunctions (Directive tPosDir 'ENTRY') tOtherToken : eTokens = tFunctions tOtherToken : eTokens >; tErrorList tFunctions (Name tPos : eName) : eTokens = >; tErrorList tFunctions (Directive tPos 'EXTERN') : eTokens = ; tErrorList tFunctions (EOF tPos '!') = /* Корректное завершение */ >; /* REVERSE */ tErrorList tFunctions tOtherToken : eTokens = tFunctions : eTokens >; } FunctionBody { tErrorList (OpenBlock tposOpenBlock '{') : eTokens = ; tErrorList token : eTokens = () () (()()) token : eTokens >; /* ErrorList Sentences Stack Scanned :Terms */ } AddToken { tPattern eToken = tPattern : eToken; /* раз такой порядок, значит не нужно будет делать reverse */ } /* ErrorList Sentences Stack Scanned :eTerms */ Pattern { tErrorList sentences openBrackets eScanned (Name posName : eName) : eTokens = ; tErrorList sentences openBrackets eScanned (Char posChar : eChar) : eTokens = ; tErrorList sentences openBrackets eScanned (Number posNumber : eNumber) : eTokens = ; tErrorList sentences openBrackets (type eScanned) (Variable posVariable : eVariable) : eTokens = ; tErrorList sentences eOpenBrackets (type eScanned) (OpenBracket posBracket '(') : eTokens = ; tErrorList sentences ((type eScanned) : eOpenBrackets) (BRACKET eInBrackets) (CloseBracket posBracket ')') : eTokens = type eScanned) : eTokens >; /* Если образец закончился, то есть мы встретили '=' и стек пуст: () значит начинаем разбирать результат */ tErrorList sentences () (() eScanned) (Assign posAssgn '=') : eTokens = () () : eTokens >; /* вызываем Result и ждем пока обработается результат, чтоб все это прикрепить к предложениям */ tErrorList sentences () (type eScanned) (Assign posAssgn '=') : eTokens = () () : eTokens >; tErrorList eSentences () () (CloseBlock posCloseBlock '}') : eTokens = ; } Result { tErrorList sentences pattern openBrackets eScanned (Name posName : eName) : eTokens = ; tErrorList sentences pattern openBrackets eScanned (Char posChar : eChar) : eTokens = ; tErrorList sentences pattern openBrackets eScanned (Number posNumber : eNumber) : eTokens = ; tErrorList sentences pattern openBrackets eScanned (Variable posVariable : eVariable) : eTokens = ; tErrorList sentences pattern eOpenBrackets scanned (OpenBracket posBracket '(') : eTokens = ; tErrorList sentences pattern (eScanned : eOpenBrackets) inBrackets (CloseBracket posBracket ')') : eTokens = : eScanned) : eTokens >; tErrorList eSentences pattern () scanned (Semicolon posSemicolon ';') : eTokens = ) : eSentences) () (()()) : eTokens >; /* ErrorList Sentences Stack Scanned :Terms */ } CompleteFunclion { tErrorList sentences : eTokens = tErrorList : eTokens; } ReverseCheckColon { ( term (Colon pos ':') :eTerms) = ; terms = ; /*tErrorList( term (Colon pos ':') :eTerms) = ; tErrorList terms = ;*/ } DoReverseCheck { /* tErrorList ((Colon pos ':') : eTerms) reversed = eTerms reversed >;*/ (term : eTerms) eReversed = ; () reversed = reversed; } Reverse { (term :eTerms) = ; terms = ; } DoReverse { (term : eTerms) eReversed = ; () reversed = reversed; } Program-Function { eFunctions tName tPos sAccess tErrorList tFunctionBody : eTokens = ; } /* ExternList = FunctionName "," ExternList | ";" */ ExternList { tErrorList eFunctions (Name tPosName tName) (Comma tPosComma ',') : eTokens = ; tErrorList tFunctions (Semicolon tPos ';') : eTokens = ; /*тут ещё будет обработка ошибок (нет имени, нет запятой, внезапный EOF, нет точки с запятой)*/ } SemanticAnalysis { tErrorList functions = tErrorList functions; } AddUnexpectedToken { errorList token : eMessage = ((token : eMessage) : errorList); } AddExpectedCharacter { errorList token : eMessage = ((token : eMessage) : errorList); }