2011-01-22 2 views
5

Я посмотрел на помощь Bison и написал это, но я не уверен, что это абсолютно правильно. Также мне нужен yylex(), который обрабатывает Lexical Analyzer (это должен быть инструмент Flex). Я знаю некоторые основные вещи о контекстно-свободных грамматиках. Но я не знаю, как правильно их реализовать! :(Нужна простая грамматика Bison для HTML

Я хочу простую грамматику Bison для HTML Вопрос заключается в том:. Что должно измениться в следующем грамматику

%{ 
    #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. */ 
%% 

Это выход Зубра:

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 

Это не будет полный HTML-парсер. Я просто хочу проверить очень простые HTML-документы без каких-либо CSS стилей или JavaScripts или ... Я также видел this. ПРИМЕЧАНИЕ: Решение должно быть грамматикой Bison!

+1

Почему бы не использовать синтаксический анализатор SGML/XML? – ThiefMaster

+3

О, и избавиться от dev-cpp. См. Http://www.jasonbadams.net/20081218/why-you-shouldnt-use-dev-c/ – ThiefMaster

+0

@ThiefMaster: Хорошая ссылка +1 – leppie

ответ

3

TAG должен быть токеном, который возвращается из лексера, иначе вы будете писать случаи, пока корова не вернется домой.

То же касается атрибутов и т. Д.

+1

Я не думаю, что «TAG» должен быть токеном; на мой взгляд, это конструкция на уровне анализатора. Думаю, это зависит от того, что вы подразумеваете под «TAG»; это просто имя тега? В этом случае да, лексер должен просто беспокоиться о идентификаторе тега как токена, и парсер должен беспокоиться о коллекции тегов, которые он хочет распознать. – Pointy

+0

@Pointy: Вот что я имею в виду. Было бы лучше просто называть его «IDENTIFIER» или тому подобное. – leppie

+0

Хотя теперь, когда я думаю об этом, ограниченный генератор парсера XML, над которым я работал, однажды предварительно загрузит таблицу идентификаторов в хэш. Лексер распознал бы «идентификатор», но затем выполнил бы хэш-поиск как удобство. Затем он мог бы дать парсеру целочисленный код для имени тега (или что-то вроде -1 для неизвестного имени), что сделало парсер намного быстрее. Конечно, синтаксический анализатор мог бы выполнить этот поиск, я думаю. – Pointy

Смежные вопросы