Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
02.05.2014
Размер:
5 Кб
Скачать
unit SyntRule; {!!! Зависит от входного языка !!!}

interface
{ Модуль, содержащий описание матрицы предшествования
  и правил грамматики }

uses LexType, Classes;

const
  RULE_LENGTH = 7; { максимальная длина правила
                     (в расчете на символы грамматики) }
  RULE_NUM = 28;   { общее количество правил грамматики }

var
{ Матрица операторного предшествования }
  GramMatrix: array[TLexType,TLexType] of char =
(     {pr. end. ;  if   (   ) else beg end whl do   a   c  :=  or  xor and  <   >   =  <>  not  -   +  um   ! }
{pr.} (' ','=','<','<',' ',' ',' ','<',' ','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end.}(' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','>'),
{;}   (' ','>','>','<',' ',' ',' ','<','>','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{if}  (' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{(}   (' ',' ',' ',' ','<','=',' ',' ',' ',' ',' ','<','<',' ','<','<','<','<','<','<','<','<','<','<','<',' '),
{)}   (' ','>','>','<',' ','>','=','<','>','<','=','<',' ',' ','>','>','>','>','>','>','>',' ','>','>',' ',' '),
{else}(' ','>','>','<',' ',' ','>','<','>','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{beg.}(' ',' ','<','<',' ',' ',' ','<','=','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{end} (' ','>','>',' ',' ',' ','>',' ','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{whil}(' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{do}  (' ','>','>','<',' ',' ','>','<','<','<',' ','<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{a}   (' ','>','>',' ',' ','>','>',' ','>',' ',' ',' ',' ','=','>','>','>','>','>','>','>',' ','>','>',' ',' '),
{c}   (' ','>','>',' ',' ','>','>',' ','>',' ',' ',' ',' ',' ','>','>','>','>','>','>','>',' ','>','>',' ',' '),
{:=}  (' ','>','>',' ','<',' ','>',' ','>',' ',' ','<','<',' ',' ',' ',' ',' ',' ',' ',' ',' ','<','<','<',' '),
{or}  (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','<','<','<','<','<','<','<','<','<',' '),
{xor} (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','<','<','<','<','<','<','<','<','<',' '),
{and} (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','>','<','<','<','<','<','<','<','<',' '),
{<}   (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','>',' ',' ',' ',' ',' ','<','<','<',' '),
{>}   (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','>',' ',' ',' ',' ',' ','<','<','<',' '),
{=}   (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','>',' ',' ',' ',' ',' ','<','<','<',' '),
{<>}  (' ',' ',' ',' ','<','>',' ',' ',' ',' ',' ','<','<',' ','>','>','>',' ',' ',' ',' ',' ','<','<','<',' '),
{not} (' ',' ',' ',' ','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '),
{-}   (' ','>','>',' ','<','>','>',' ','>',' ',' ','<','<',' ','>','>','>','>','>','>','>',' ','>','>','<',' '),
{+}   (' ','>','>',' ','<','>','>',' ','>',' ',' ','<','<',' ','>','>','>','>','>','>','>',' ','>','>','<',' '),
{um}  (' ','>','>',' ','<','>','>',' ','>',' ',' ','<','<',' ','>','>','>','>','>','>','>',' ','>','>','<',' '),
{!}   ('<',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '));

{ Правила исходной грамматики }
  GramRules: array[1..RULE_NUM] of string =
  ('progEend.','E','E;E','E;','if(B)EelseE','if(B)E',
   'beginEend','while(B)doE','a:=E','BorB','BxorB','B',
   'BandB','B','E<E','E>E','E=E','E<>E','(B)','not(B)',
   'E-E','E+E','E','-E','E','(E)','a','c');

function MakeSymbolStr(iRuleNum: integer): string;

{ Функция корректировки отношений предшествования
  для расширения матрицы предшествования }
function CorrectRule(cRule: char; lexTop,lexCur: TLexType;
                     symbStack: TList): char;

implementation

uses SyntSymb;

function MakeSymbolStr(iRuleNum: integer): string;
begin
  if iRuleNum in [10..20] then Result := 'B'
                          else Result := 'E';
end;

function CorrectRule(cRule: char; lexTop,lexCur: TLexType;
                     symbStack: TList): char;
var j: integer;
begin
  { Корректируем отношение для символа "else", если в стеке
    не логическое выражение }
  Result := cRule;
  if (cRule = '=') and (lexTop = LEX_CLOSE)
   and (lexCur = LEX_ELSE) then
  begin
    j := TSymbStack(symbStack).Count-1;
    if (j > 2)
     and (TSymbStack(symbStack)[j-2].SymbolStr <> 'B')
    then Result := '>';
  end;
end;

end.
Соседние файлы в папке Cursov