2011-01-22 3 views
5

私はBisonのヘルプを見て、これを書いていますが、完全に正しいかどうかはわかりません。また、私はyylex()レキシカルアナライザ(それはFlexツールでなければならない)を処理する必要があります。文脈自由文法に関するいくつかの基本的なことを知っています。しかし、私はそれらを正しく実装する方法を知らない! :(HTMLの簡単なBison文法が必要です

は、私はHTMLのためのシンプルなのBison文法をしたい質問です:?文法を以下に変更する必要がありますどのような

%{ 
    #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パーサです。CSSのスタイルまたはJavaScriptsのない非常に単純なHTMLドキュメントを検証したいだけです... 私も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

関連する問題