Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pascal_yacc (1).doc
Скачиваний:
44
Добавлен:
28.03.2015
Размер:
708.61 Кб
Скачать

Приложение б (обязательное) Модуль синтаксического анализатора

%{ unit yaccKR1;

{$o-}

interface

uses lexlib,yacclib,lexKRModul,dialogs;

type

st1=string[1];

st2=string[2];

st3=string[3];

st4=string[4];

st5=string[5];

st7=string[7];

idtype=string[20];

var

i:integer;

m:array [0..250] of string;

%}

%token <st3> key_var

%token <idtype> id

%token <st1> dp

%token <st7> typ

%token <st1> tz

%token <st5> key_begin

%token <st3> key_end

%token <st1> tchk

%token <st1> zpt

%token <st2> prisv

%token <st4> key_read

%token <st1> os

%token <st1> zs

%token <st5> key_write

%token <st5> key_while

%token <st2> key_do

%token <st2> key_if

%token <st4> key_then

%token <st4> key_else

%token <st3> key_and

%token <st2> key_or

%token <st1> sign

%token <st1> mult

%token <st1> division

%token <st1> plus

%token <st1> minus

%token <real> num

%token <st1> space

%type <integer> VARZONE

%type <integer> VARZONE1

%type <integer> LIST_ID

%type <integer> PROGZONE

%type <integer> COMMANDS

%type <integer> COMMAND

%type <integer> PRISVCOM

%type <integer> READCOM

%type <integer> WRITECOM

%type <integer> WHILECOM

%type <integer> IFCOM

%type <integer> ELSECOM

%type <integer> IF_INSTR

%type <integer> BOOL

%type <integer> BOOL_TERM

%type <integer> BOOL_EXPR

%type <integer> BOOL_FACTOR

%type <integer> BOOL_FACTOR1

%type <integer> BLOCK

%type <integer> EXPR

%type <integer> TERM

%type <integer> TERM1

%type <integer> EXPR1

%type <integer> FACTOR

%type <integer> GOAL

%%

GOAL : VARZONE PROGZONE { m[i] := 'goal('+m[$1]+','+m[$2]+')'; $$ := i; inc(i); }

VARZONE : key_var id LIST_ID dp typ tz VARZONE1 { m[i] := $1+'('+$5+'('+$2+m[$3]+')'+m[$7]+')'; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

VARZONE1 : id LIST_ID dp typ tz VARZONE1 { m[i] := ','+$4+'('+$1+m[$2]+')'+m[$6]; $$:=i; inc(i); }

| { m[i] := '';$$ := i; inc(i); }

LIST_ID : zpt id LIST_ID { m[i] := ','+$2+m[$3]; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

PROGZONE : key_begin COMMANDS key_end tchk { m[i] := 'progzone('+m[$2]+')'; $$ := i; inc(i); }

COMMANDS : COMMAND tz COMMANDS {If m[$3]<>'' then m[i]:=m[$1]+','+m[$3] else m[i]:=m[$1]+m[$3]; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

COMMAND : BLOCK { m[i] := m[$1]; $$ := i; inc(i); }

| PRISVCOM { m[i] := m[$1]; $$ := i; inc(i); }

| READCOM { m[i] := m[$1]; $$ := i; inc(i); }

| WRITECOM { m[i] := m[$1]; $$ := i; inc(i); }

| WHILECOM { m[i] := m[$1]; $$ := i; inc(i); }

| IFCOM { m[i] := m[$1]; $$ := i; inc(i); }

PRISVCOM : id prisv EXPR { m[i] := 'prisv('+$1+','+m[$3]+')'; $$ := i; inc(i); }

READCOM : key_read os id zs { m[i] := $1+$2+$3+$4; $$ := i; inc(i);}

WRITECOM : key_write os id zs { m[i] := $1+$2+$3+$4; $$ := i; inc(i); }

WHILECOM : key_while BOOL key_do BLOCK {m[i] := $1+'('+m[$2]+','+$3+'('+m[$4]+'))'; $$ := i; inc(i);}

IFCOM : key_if BOOL key_then IF_INSTR ELSECOM { m[i] := $1+'('+m[$2]+','+$3+'('+m[$4]+')'+m[$5]+')'; $$ := i; inc(i); }

ELSECOM : key_else IF_INSTR { m[i] := ','+$1+'('+m[$2]+')'; $$ := i;inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

IF_INSTR : IFCOM { m[i] := m[$1]; $$ := i; inc(i); }

| BLOCK { m[i] := m[$1]; $$ := i; inc(i); }

BOOL : BOOL_FACTOR BOOL_TERM { m[i] := m[$1]+m[$2]; $$ := i; inc(i); }

| BOOL_FACTOR BOOL_EXPR { m[i] := m[$1]+m[$2]; $$:=i; inc(i); }

BOOL_TERM : key_and BOOL { m[i] := $1+m[$2]; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

BOOL_EXPR : key_or BOOL { m[i] := $1+m[$2]; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

BOOL_FACTOR : os BOOL_FACTOR1 zs { m[i] := $1+m[$2]+$3; $$ := i; inc(i); }

BOOL_FACTOR1 : FACTOR sign FACTOR { m[i] := m[$1]+$2+m[$3]; $$ := i; inc(i); }

BLOCK : key_begin COMMANDS key_end { m[i] := m[$2]; $$ := i; inc(i); }

EXPR : TERM EXPR1 { m[i] := m[$1]+m[$2]; $$ := i; inc(i); }

TERM : FACTOR TERM1 { m[i] := m[$1]+m[$2]; $$ := i; inc(i); }

TERM1 : mult FACTOR TERM1 { m[i] := '*('+m[$2]+','+m[$3]+')'; $$ := i; inc(i); }

| division FACTOR TERM1 { m[i] := '/('+m[$2]+','+m[$3]+')'; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

EXPR1 : plus TERM EXPR1 { m[i] := '+('+m[$2]+','+m[$3]+')'; $$ := i; inc(i); }

| minus TERM EXPR1 { m[i] := '-('+m[$2]+','+m[$3]+')'; $$ := i; inc(i); }

| { m[i] := ''; $$ := i; inc(i); }

FACTOR : num { m[i] := floattostr($1); $$ := i; inc(i); }

| id { m[i] := $1; $$ := i; inc(i); }

%%

(*$I Ilex.pas*)

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]