Tato stránka vyžaduje podporu CSS stylů
Semestrální práce z předmětu PJ
Odstranění nepoužitých funkcí a proměnných z C/C++
Oto Válek
FEL ČVUT, zimní semestr 2001/2002, cvičení St 9:15
1. Popis
Program provádí lexikální a částečnou syntaktickou analýzu zdrojového textu
v C/C++. Nalezené funkce a proměnné (i lokální, ne však metody tříd a třídní
proměnné) ukládá do dynamické vnitřní struktury - stromu vnořených bloků.
Součástí struktury je i informace o místě začátku a konce příslušných elementu
ve zdrojovém textu (řádek,sloupec). Je dodržováno zakrývaní deklarací
(program > parametry > lok.proměnné > proměnné v bloku).
Následně program traverzováním stromu určí, které funkce a proměnné lze odstranit,
a po jejich vyjmutí ze zdrojového textu výsledek zapíše do výstupního souboru.
2. Lexikální symboly (terminály)
IDENT | identifikátor |
NUMBER | číslo |
STRING | "řetězec" |
CHAR | 'znak' |
SEMICOLON | ; |
COMMA | , |
LPAR | ( |
RPAR | ) |
PLUS | + |
MINUS | - |
ASTERISK | * |
DIVIDE | / |
EQUALS | == |
BEGIN | { |
END | } |
ASSIGNMENT | = |
AMPERSAND | & |
DOT | . |
DEREFERENCE | -> |
LESS | < |
LESSOREQUAL | <= |
GREATER | > |
| |
GREATEROREQUAL | >= |
LBRACKET | [ |
RBRACKET | ] |
NEGATION | ! |
QUESTION | ? |
COLON | : |
DOUBLECOLON | :: |
TILDE | ~ |
AND | & |
OR | | |
LOGICALAND | && |
LOGICALOR | || |
XOR | ^ |
TYPEDEF | typedef |
STRUCT | struct |
CLASS | class |
ENUM | enum |
CONST | const |
UNSIGNED | unsigned |
STATIC | static |
EXTERN | extern |
INLINE | inline |
| |
INCREMENT | ++ |
DECREMENT | -- |
PLUSASSIGNMENT | += |
MINUSASSIGNMENT | -= |
MULTASSIGNMENT | *= |
DIVASSIGNMENT | /= |
ANDASSIGNMENT | &= |
ORASSIGNMENT | |= |
BREAK | break |
CONTINUE | continue |
FOR | for |
WHILE | while |
DO | do |
IF | if |
ELSE | else |
SWITCH | switch |
CASE | case |
DEFAULT | default |
RETURN | return |
DIRECTIVE | #..... |
COMMENT | /* .... */ |
EOI | konec vstupu |
|
3. LL(1) gramatika
Terminály mají názvy tvořené velkými písmeny, neterminály kombinací malých
a velkých písmen. Pro syntaktická analýza metodou shora dolů jsou neterminály
Expression, ExpressionIdent a StructBody dále nedělitelné - nejsou řešeny
rekurzivním sestupem, protože jejich analýza není pro fuknci programu nutná.
Program -> Element Program | EOI
Element -> Typ Ref ElementTyp | TYPEDEF Typ Typedef
ElementTyp -> IDENT ZbElement | SEMICOLON
ZbElement -> Deklarace SEMICOLON | Funkce
Deklarace -> Index Construct DeklAssign ZbDekl
ZbDekl -> COMMA Ref IDENT Index Construct DeklAssign ZbDekl | e
DeklAssign -> ASSIGNMENT Expression | e
Funkce -> LPAR Parametry RPAR FuncBody
FuncBody -> Blok | SEMICOLON
Construct -> LPAR CallParam RPAR | e
Ref -> ASTERISK Ref | AND Ref | e
Index -> LBRACKET Expression RBRACKET | e
Parametry -> Typ OnePar ZbPar | e
ZbPar -> COMMA Typ OnePar ZbPar | e
OnePar -> Ref ZbOnePar | e
ZbOnePar -> IDENT Index Constructor | e
Blok -> BEGIN ZbBlok END
ZbBlok -> Command ZbBlok | e
Command -> IDENT CommandId | Typ Ref IDENT Deklarace SEMICOLON
| TYPEDEF Typ Typedef | Blok | For | While | Do | If | Switch
| RETURN Return SEMICOLON | BREAK SEMICOLON | CONTINUE SEMICOLON
| SEMICOLON
CommandId -> Ref IDENT Deklarace SEMICOLON | DOT IDENT CommandId
| Call | ASSIGNMENT Assignment | PLUSASSIGNMENT Assignment
| MINUSASSIGNMENT Assignment | MULTASSIGNMENT Assignment
| DIVASSIGNMENT Assignment | ANDASSIGNMENT Assignment
| ORASSIGNMENT Assignment | Expression SEMICOLON
Call -> LPAR CallParam RPAR SEMICOLON
CallParam -> Expression CallZbParam | e
CallZbParam-> COMMA Expression CallZbParam | e
Assignment -> Expression SEMICOLON
For -> FOR LPAR Expression SEMICOLON Expression SEMICOLON Expression RPAR Command
While -> WHILE LPAR Expression RPAR Command
Do -> DO Command WHILE LPAR Expression RPAR
If -> IF LPAR Expression RPAR Command ELSE
Else -> ELSE Command | e
Switch -> SWITCH LPAR Expression RPAR BEGIN Case END
Case -> CASE Expression COLON CaseBody Case | DEFAULT COLON CaseBody Case | e
CaseBody -> Command CaseBody | e
Return -> Expression | e
Typ -> CONST Typ | STATIC Typ | INLINE Typ | EXTERN Typ | UNSIGNED Typ | ZbTyp | e
ZbTyp -> IDENT FnTyp | ENUM TypIdent StructBody | STRUCT TypIdent StructBody | CLASS TypIdent StructBody
TypIdent -> IDENT | e
FnTyp -> LPAR Ref ZbFnTyp RPAR LPAR Parametry RPAR | e
ZbFnTyp -> IDENT | e
Typedef -> Ref IDENT Index SEMICOLON | SEMICOLON
StructBody -> BEGIN ... END | e
Expression -> { ExprIdent | ... }
ExprIdent -> e
4. Atributy neterminálů
Téměř všechny neterminály mají dědičný atribut context,
který obsahuje aktuální kontext proměnných. Další dědičné atributy obsahují
řetězce identifikátorů (ident, lvalue)
nebo odkazy na začátky a konce elementů ve zdroj. textu pro pozdější
odstranění (start, stop).
Assignment | lvalue |
Call | ident |
CommandId | ident |
ZbOnePar | start |
OnePar | start |
FuncBody | ident |
Funkce | ident, start |
ZbDekl | ident, start, stop |
Deklarace | ident, start |
ZbElement | ident, startfunc, startvar |
ElementTyp | startfunc, startvar |