$EXTERN Lexer, Put, Arg, Open; $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 { errorList sentences openBrackets eScanned (Name posName : eName) : eTokens = ; errorList sentences openBrackets eScanned (Char posChar : eChar) : eTokens = ; errorList sentences openBrackets eScanned (Number posNumber : eNumber) : eTokens = ; errorList sentences openBrackets eScanned (Variable posVariable : eVariable) : eTokens = ; errorList sentences openBrackets eScanned (OpenBracket posBracket '(') : eTokens = ; errorList sentences (eScanned : eOpenBrackets) inBrackets (CloseBracket posBracket ')') : eTokens = : eScanned) : eTokens >; /* Если образец закончился, то есть мы встретили '=' и стек пуст: () значит начинаем разбирать результат */ errorList sentences () scanned (Assign posAssgn '=') : eTokens = () () : eTokens >; /* вызываем Result и ждем пока обработается результат, чтоб все это прикрепить к предложениям */ errorList eSentences () (CloseBlock posCloseBlock '}') : eTokens = ; } Result { errorList sentences pattern openBrackets eScanned (Name posName : eName) : eTokens = ; errorList sentences pattern openBrackets eScanned (Char posChar : eChar) : eTokens = ; errorList sentences pattern openBrackets eScanned (Number posNumber : eNumber) : eTokens = ; errorList sentences pattern openBrackets eScanned (Variable posVariable : eVariable) : eTokens = ; errorList sentences pattern openBrackets eScanned (OpenBracket posBracket '(') : eTokens = ; errorList sentences pattern (eScanned : eOpenBrackets) inBrackets (CloseBracket posBracket ')') : eTokens = : eScanned) : eTokens >; errorList eSentences pattern () scanned (Semicolon posSemicolon ';') : eTokens = ) : eSentences) () : eTokens >; } CompleteFunclion { errorList sentences : eTokens = errorList : eTokens; } ReverseCheckColon { errorList( term (Colon pos ':') :eTerms) = ; errorList terms = ; } DoReverseCheck { errorList ((Colon pos ':') : eTerms) reversed = eTerms reversed >; (term : eTerms) eReversed = ; () reversed = reversed; } Reverse { (term :eTerms) = ; terms = ; } DoReverse { (term : eTerms) eReversed = ; () reversed = reversed; } ParseResult { tErrorList tPattern tResult (Char tCharPos tChar) : eTokens = : eTokens >; /*---- other tokens ----*/ tErrorList tPattern tResult (CloseBlock tposCloseBlock ';') : eTokens = ; tErrorList tPattern tResult (CloseBlock tposCloseBlock '}') : eTokens = tErrorList (tPattern tResult) : eTokens; } 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 { errorList functions = errorList functions; } AddUnexpectedToken { errorList token : eMessage = ((token : eMessage) : errorList); } AddExpectedCharacter { errorList token : eMessage = ((token : eMessage) : errorList); }