cdvmDDr (1158400), страница 2
Текст из файла (страница 2)
TOKEN "TOKEN" -- лексема (ссылка в строковую память)
DLM "DLM" -- разделитель во входном потоке
KWD "KWD" -- ключевое слово во входном потоке
LXX "LXX" -- список без разделителя
LXI "IDENT" -- идентификатор
LXN "NUMBER" -- числовая константа
LXC "LXC" -- символьная константа
LXR "REAL" -- число в плавающем формате
LXS "STRING" -- строковая константа
CPP "CPP" -- препроцессорный оператор
2.4.2Разделители и операторы
SEMIC ";"
COMMA ","
LBA "("
LBS "{"
LBK "["
RBA ")"
RBK "]"
RBS "}"
POINT "."
QUEST "?"
COLON ":"
DIV "/"
ADIV "/="
COMM "/*" -- начало C комментария
CPPCOMM "//" -- начало C++ комментария
MOD "%"
AMOD "%="
ADD "+"
AADD "+="
INC "++"
SUB "-"
ASUB "-="
DEC "--"
ARROW "->"
MUL "*"
AMUL "*="
ASSIGN "="
EQU "=="
LT "<"
LE "<="
LSH "<<"
ALSH "<<="
GT ">"
GE ">="
RSH ">>"
ARSH ">>="
BNOT "~"
NOT "!"
NEQ "!="
BAND "&"
AAND "&="
AND "&&"
BOR "|"
AOR "|="
OR "||"
BXOR "^"
AXOR "^="
2.4.3Ключевые слова
RETURN "return"
IF "if"
ELSE "else"
WHILE "while"
DO "do"
FOR "for"
BREAK "break"
CONTINUE "continue"
SWITCH "switch"
CASE "case"
DEFAULT "default"
GOTO "goto"
SIZEOF "sizeof"
TYPEDEF "typedef"
EXTERN "extern"
STATIC "static"
REGISTER "register"
AUTO "auto"
CONST "const"
INT "int"
SHORT "short"
LONG "long"
VOID "void"
CHAR "char"
SIGNED "signed"
UNSIGNED "unsigned"
FLOAT "float"
DOUBLE "double"
STRUCT "struct"
UNION "union"
ENUM "enum"
2.4.4Ключевые слова и идентификаторы C-DVM
LX_DVM "DVM"
PROCESSORS "PROCESSORS"
DISTRIBUTE "DISTRIBUTE"
BLOCK "BLOCK"
GENBLOCK "GENBLOCK"
ONTO "ONTO"
ALIGN "ALIGN"
WITH "WITH"
TEMPLATE "TEMPLATE"
SHADOW "SHADOW"
LX_SG "SHADOW_GROUP"
LX_RG "REDUCTION_GROUP"
LX_RMG "REMOTE_GROUP"
TASK "TASK"
REDISTRIBUTE "REDISTRIBUTE"
REALIGN "REALIGN"
NEW "NEW"
LX_CRTEMP "CREATE_TEMPLATE"
PARALLEL "PARALLEL"
ON "ON"
REDUCTION "REDUCTION"
SHRENEW "SHADOW_RENEW"
ACROSS "ACROSS"
LX_CRSG "CREATE_SHADOW_GROUP"
CORNER "CORNER"
SHSTART "SHADOW_START"
SHWAIT "SHADOW_WAIT"
SUM "SUM"
PROD "PRODUCT"
MAX "MAX"
MIN "MIN"
LX_OR "OR"
LX_AND "AND"
MAXLOC "MAXLOC"
MINLOC "MINLOC"
RSTART "REDUCTION_START"
RWAIT "REDUCTION_WAIT"
REMOTE "REMOTE_ACCESS"
INDIRECT "INDIRECT_ACCESS"
PREFETCH "PREFETCH"
RESET "RESET"
MAP "MAP"
LX_TASKREG "TASK_REGION"
INTERVAL "INTERVAL"
DEBUG "DEBUG"
LX_NUMBER_OF_PROC "NUMBER_OF_PROCESSORS"
LX_FOR "FOR"
LX_DO "DO"
LX_main "main"
LX_malloc "malloc"
LX_free "free"
optD0 "d0"
optD1 "d1"
optD2 "d2"
optD3 "d3"
optD4 "d4"
optE0 "e0"
optE1 "e1"
optE2 "e2"
optE3 "e3"
optE4 "e4"
2.5Парсер
Назначение парсера:
-
проанализировать контекстно-свободную структуру программы;
-
сообщать об ошибках, когда они найдены;
-
строить дерево разбора;
-
вызывать семантические программы для построенных узлов.
Метод разбора -- простой рекурсивный спуск с возвратами в немногочисленных сомнительных случаях. Структура дерева разбора описана в следующем разделе.
Парсер реализован в виде рекурсивной функции Parse, использующей внутреннее представление синтаксиса, которое хранится в списковой памяти в виде дерева синтаксиса. Дерево синтаксиса строится функцией STXinit с помощью функций:
-
STXterm для создания терминального элемента;
-
STXelem для создания нетерминального элемента;
-
STXrule для синтаксического правила;
-
STXgroup для группы синтаксических правил;
-
STXgrlist для списка групп правил.
Парсер использует также следующие функции:
-
ParsErr сообщает об ошибке;
-
cmpLX сравнивает текущую лексему с терминальным элементом правила;
-
SkipNext использует правила для просмотра вперед и выполняет или пропускает следующее правило;
-
ISWF -- это головная семантическая программа, вызываемая дважды для каждого узла.
2.6Структура дерева разбора
Нижеследующая таблица описывает структуру дерева разбора в такой форме. Для всех кодов узлов (слева) представлен фрагмент исходного текста, в котором через A и B обозначены подконструкции, соответствующие поддеревьям, на которые указывают, соответственно, поля A и B. AB соответствует поддереву под полем A узла, на который указывает поле B исходного узла. Когда разбиение исходного текста неочевидно, маркеры прокомментированы. Здесь описана только "свободная" структура. Зависимости и ограничения не упоминаются.
2.6.1Терминалы, списки, скобки
TOKEN: -- A указывает позицию в строковой памяти
DLM: -- A -- внутренний код разделителя
KWD: -- A -- внутренний код ключевого слова
LXI: -- A -- ссылка на узел с кодом TOKEN
LXN: -- A -- ссылка на узел с кодом TOKEN
LXC: -- A -- ссылка на узел с кодом TOKEN
LXR: -- A -- ссылка на узел с кодом TOKEN
LXS: -- A -- ссылка на узел с кодом TOKEN
CPP: -- A -- директива препроцессора как строка
COMMA: A , B -- список через запятую
LXX: A [B-tail] -- B-список
XXlist: A [B-tail] -- B-список
XXslist: A [B-tail] -- B-список
LBA: "(" [A] ")"
LBS: "{" [A ] "}" -- составной оператор
LBK: [A] "[" [B] "]" -- операция индексации
2.6.2Описания (СИ)
LXX: [AA-DVM_directive] BA-decl [ B-next ]
XXdecl: [AA-storage_class] BA-type B-declarator-list
XXtype: [AA-storage_class] BA-type B-abstract-declarator
Класс памяти :
STATIC: static [B]
AUTO: auto [B]
REGISTER: register [B]
EXTERN: extern [B]
TYPEDEF: typedef [B]
CONST: const [B]
Тип (простые типы связаны в список полями B)
STRUCT: struct [A] ["{" AB-fields "}"]
UNION: union [A] ["{" AB-fields "}"]
ENUM: enum [A] ["{" B "}"]
VOID: void
TYPEDEF: B - typedef-name
UNSIGNED: unsigned [B]
SIGNED: signed [B]
CHAR: char [B]
SHORT: short [B]
LONG: long [B]
INT: int [B]
FLOAT: float [B]
DOUBLE: double [B]
Деклараторы:
0: AA-declarator [BA-initializer] B-list-tail
LXaster: * [B-"const"] A
LXfun: A "(" [B] ")"
Инициализаторы:
ASS: = A
COLON: : A
Хвост списка деклараторов:
XXbody: "{" [A] "}" [B -- ";"]
XXclist: , A
SEMIC: ; -- конец описания
2.6.3Операторы (СИ)
XXoper: A
IF: if "(" AA ")" BA [else B]
WHILE: while "(" A ")" B
DO: do B while "(" A ")" ;
FOR: for "(" AA ; ABA ; BBA ")" B
SWITCH: switch "(" A ")" "{" B "}"
GOTO: goto A ;
LXskip: ;
RETURN: return [A] ;
LX_FOR: FOR "(" AA , BA ")" B
LX_DO: DO "(" AA-variable , BA ")" B
CONTINUE: continue ;
BREAK: break ;
COLON: A :
XXexpr: A ;
DEFAULT: default: [B]
CASE: case A : [B]
2.6.4Выражения (СИ)
LBK: A "[" B "]"
POINT: A . B
ARROW: A -> B A
SS: A = B
AADD: A += B
ASUB: A -= B
AMUL: A *= B
ADIV: A /= B
AMOD: A %= B
ARSH: A >>= B
ALSH: A <<= B
AAND: A &= B
AXOR: A ^= B
AOR: A |= B
QUEST: A ? AB : BB
OR: A || B
AND: A && B
BOR: A | B
BXOR: A ^ B
BAND: A & B
EQU: A == B
NEQ: A != B
GT: A > B
GE: A >= B
LT: A < B
LE: A <= B
RSH: A >> B
LSH: A << B
ADD: [A] + B
SUB: [A] - B
MUL: A * B
DIV: A / B
MOD: A % B
LXinca: A ++
LXdeca: A --
NOT: ! B
BNOT: ~ B
SUB: - B
ADD: + B
INC: ++ B
DEC: -- B
SIZEOF: sizeof ( B )
LXaddr: & B
LXcont: * B















