2011-01-22 13 views
5

Popatrzyłem na pomoc Bison i napisałem to, ale nie jestem pewien, czy to całkowicie poprawne. Potrzebuję również yylex(), który obsługuje narzędzie Lexical Analyzer (powinno być to narzędzie Flex). Znam kilka podstawowych rzeczy o gramatykach bezkontekstowych. Ale nie wiem, jak je poprawnie wdrożyć! :(Potrzebujesz prostej gramatyki Bison dla HTML

Chcę prostego Bison gramatyki dla HTML Pytanie brzmi:. Co należy zmienić w następujących gramatyki

%{ 
    #include <stdio.h> 
    int yylex(void); 
    int yyerror(char const *); 
%} 

%token NUM_TOKEN FILENAME_TOKEN COLOR_TOKEN NAME_TOKEN 

/* Html Grammer follows... */ 
%% 


/* Any html tag follow this pattern: */ 
EXPRESSION: 
      '<' TAG CLUSER '>' INNER_EXPRESSION "</" TAG '>' ; 

/* Some html tags: */ 
TAG: 
    "a" | 
    "html" | 
    "head" | 
    "link" | 
    "div" | 
    "input"| 
    "from" | 
    "title"| 
    "img" | 
    "table"| 
    "td" | 
    "tr" ; 


CLUSER: 
     ALIGN| 
     CLASS| 
     ID| 
     SRC| 
     TEPY| 
     ACTION| 
     HREF| 
     REL| 
     /* € (Eplsilone) */ 
     ; 


ALIGN: 
     "align" '=' "left"| 
     "align" '=' "right"| 
     "align" '=' "center" 
     ; 

CLASS: 
     "class" '=' NAME_TOKEN 
     ; 

ID: 
     "id" '=' NAME_TOKEN 
     ; 

SRC: 
     "src" '=' FILENAME_TOKEN 
     ; 

TEPY: 
     "type" '=' CONT 
     ; 

ACTION: 
     "action" '=' FILENAME_TOKEN 
     ; 

HREF: 
     "href" '=' '\"#\"'| 
     "href" '=' FILENAME_TOKEN 
     ; 

REL: 
     "rel" '=' "stylesheet"| 
     "rel" '=' "\"stylesheet\"" 
     ; 


DOMIN: 
     "px"| 
     "mm"| 
     "cm"| 
     "inch" 
     ; 

PAS: 
    "php"| 
    "asp"| 
    "aspx"| 
    "css" 
    ; 

CONT: 
    "button"| 
    "checkbox"| 
    "text"| 
    "password"| 
    "file"| 
    "submit" 
    ; 

INNER_EXPRESSION: 
    EXPRESSION| 
    /* € (Eplsilone) */ 
    ; 


/* Html grammer ends. */ 
%% 

To wyjście bizonów:

E:\Program Files\GnuWin32\bin>bison "E:\Dev-Cpp\HtmlBison\html.y" -o "E:\html.c" 

E:\Dev-Cpp\HtmlBison\html.y: warning: 2 nonterminals useless in grammar 
E:\Dev-Cpp\HtmlBison\html.y: warning: 8 rules useless in grammar 
E:\\Dev-Cpp\\HtmlBison\\html.y:83.1-5: warning: nonterminal useless in grammar: 
DOMIN 
E:\\Dev-Cpp\\HtmlBison\\html.y:90.1-3: warning: nonterminal useless in grammar: 
PAS 
E:\\Dev-Cpp\\HtmlBison\\html.y:84.7-10: warning: rule useless in grammar: DOMIN: 
"px" 
E:\\Dev-Cpp\\HtmlBison\\html.y:85.7-10: warning: rule useless in grammar: DOMIN: 
"mm" 
E:\\Dev-Cpp\\HtmlBison\\html.y:86.7-10: warning: rule useless in grammar: DOMIN: 
"cm" 
E:\\Dev-Cpp\\HtmlBison\\html.y:87.7-12: warning: rule useless in grammar: DOMIN: 
"inch" 
E:\\Dev-Cpp\\HtmlBison\\html.y:91.6-10: warning: rule useless in grammar: PAS: " 
php" 
E:\\Dev-Cpp\\HtmlBison\\html.y:92.6-10: warning: rule useless in grammar: PAS: " 
asp" 
E:\\Dev-Cpp\\HtmlBison\\html.y:93.6-11: warning: rule useless in grammar: PAS: " 
aspx" 
E:\\Dev-Cpp\\HtmlBison\\html.y:94.6-10: warning: rule useless in grammar: PAS: " 
css" 
m4: cannot open `Files\GnuWin32/share/bison': No such file or directory 
m4: cannot open `E:\Program': No such file or directory 
m4: cannot open `Files\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file or 
directory 

To nie będzie kompletny parser HTML. Chcę tylko sprawdzać bardzo proste dokumenty HTML bez żadnych stylów CSS lub JavaScripts lub ... Widziałem także this. UWAGA: Rozwiązanie musi być gramatyką Bison!

+1

Dlaczego nie używać parsera SGML/XML? – ThiefMaster

+3

Aha, i pozbyć się dev-cpp. Zobacz http://www.jasonbadams.net/20081218/why-you-shouldnt-use-dev-c/ – ThiefMaster

+0

@ ThiefMaster: Dobry link +1 – leppie

Odpowiedz

3

TAG powinien być tokenem, który jest zwracany z lexera, inaczej będziesz pisać skrzynki, dopóki krowy nie wrócą do domu.

To samo dotyczy atrybutów itp.

+1

Nie uważam, że "TAG" powinien być tokenem; jest to według mnie konstrukt na poziomie parsera. Myślę, że to zależy od tego, co masz na myśli przez "TAG"; czy to tylko nazwa tagu? W takim przypadku, tak, lexer powinien po prostu martwić się o identyfikator znacznika jako token, a parser powinien martwić się zbieraniem znaczników, które chce rozpoznać. – Pointy

+0

@Pointy: Właśnie o to mi chodzi. Byłoby lepiej po prostu nazwać to "IDENTYFIKATOR" lub coś takiego. – leppie

+0

Chociaż teraz o tym myślę, ograniczony generator parsera XML, nad którym pracowałem, wstępnie wczytałby tabelę identyfikatorów w hasz. Lexer rozpozna "identyfikator", ale wówczas wykona wyszukiwanie hash jako udogodnienie. Następnie może dać parserowi kod całkowity dla nazwy znacznika (lub coś podobnego do -1 dla nieznanej nazwy), co spowodowało, że parser był o wiele szybszy. Oczywiście parser mógłby również wykonać to wyszukiwanie. – Pointy