2011-01-22 36 views
5

Tôi đã xem xét sự trợ giúp của Bison và đã viết điều này, nhưng tôi không chắc nó hoàn toàn chính xác. Ngoài ra tôi cần một số yylex() để xử lý Phân tích Lexical (Công cụ này phải là công cụ Flex). Tôi biết một số điều cơ bản về ngữ pháp không có ngữ cảnh. Nhưng tôi không biết làm thế nào để thực hiện chúng một cách chính xác! :(Cần một ngữ pháp Bison đơn giản cho HTML

Tôi muốn có một ngữ pháp Bison đơn giản cho HTML Câu hỏi đặt ra là:. Có gì cần thay đổi trong sau ngữ pháp

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

Đây là sản lượng Bison của:

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 

Nó sẽ không được một trình phân tích cú pháp HTML hoàn chỉnh. Tôi chỉ muốn xác thực các tài liệu HTML rất đơn giản mà không cần bất kỳ kiểu dáng CSS hoặc JavaScripts hoặc ... Tôi cũng thấy this. LƯU Ý: Giải pháp phải là ngữ pháp Bison!

+1

Tại sao không sử dụng trình phân tích cú pháp SGML/XML? – ThiefMaster

+3

Ồ, và loại bỏ dev-cpp. Xem http://www.jasonbadams.net/20081218/why-you-shouldnt-use-dev-c/ – ThiefMaster

+0

@ThiefMaster: Liên kết tốt +1 – leppie

Trả lời

3

TAG phải là mã thông báo được trả lại từ một từ khóa, nếu không bạn sẽ viết các trường hợp cho đến khi bò về nhà.

Các thuộc tính tương tự, v.v.

+1

Tôi không nghĩ rằng "TAG" phải là mã thông báo; đó là một cấu trúc cấp phân tích theo ý kiến ​​của tôi. Tôi đoán nó phụ thuộc vào những gì bạn có nghĩa là bởi "TAG"; nó chỉ là tên thẻ? Trong trường hợp đó, có lexer chỉ nên lo lắng về định danh thẻ làm mã thông báo và trình phân tích cú pháp phải lo lắng về việc thu thập các thẻ mà nó sẵn sàng nhận ra. – Pointy

+0

@Pointy: Đó là ý của tôi. Sẽ tốt hơn nếu chỉ gọi nó là 'IDENTIFIER' hoặc như vậy. – leppie

+0

mặc dù bây giờ tôi nghĩ về nó, một trình tạo phân tích cú pháp XML hạn chế mà tôi đã làm việc trên một lần sẽ tải trước bảng nhận dạng vào một băm. Các lexer sẽ nhận ra "định danh", nhưng sau đó sẽ thực hiện tra cứu hash là một tiện lợi. Sau đó nó có thể cung cấp cho trình phân tích cú pháp một mã số nguyên cho tên thẻ (hoặc một cái gì đó như -1 cho một tên không xác định), làm cho trình phân tích cú pháp nhanh hơn rất nhiều. Tất nhiên, trình phân tích cú pháp cũng có thể thực hiện tra cứu đó. – Pointy

Các vấn đề liên quan