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)

IDENTidentifiká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^
TYPEDEFtypedef
STRUCTstruct
CLASSclass
ENUMenum
CONSTconst
UNSIGNEDunsigned
STATICstatic
EXTERNextern
INLINEinline
   
INCREMENT++
DECREMENT--
PLUSASSIGNMENT+=
MINUSASSIGNMENT-=
MULTASSIGNMENT*=
DIVASSIGNMENT/=
ANDASSIGNMENT&=
ORASSIGNMENT|=
BREAKbreak
CONTINUEcontinue
FORfor
WHILEwhile
DOdo
IFif
ELSEelse
SWITCHswitch
CASEcase
DEFAULTdefault
RETURNreturn
DIRECTIVE#.....
COMMENT/* .... */
EOIkonec 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).
Assignmentlvalue
Callident
CommandIdident
ZbOneParstart
OneParstart
FuncBodyident
Funkceident, start
ZbDeklident, start, stop
Deklaraceident, start
ZbElementident, startfunc, startvar
ElementTyp  startfunc, startvar