2014-02-06 25 views
1

我正在用ANTLR4構建解析Quake III着色器的語法。如何製作「全局解析器規則」?

這裏是一個着色器的爲例:

textures/liquids/lava-example 
{ 
    deformVertexes wave sin 0 3 0 0.1 
    q3map_tessSize 64 
    surfaceparm lava 
    qer_editorimage textures/common/lava.tga 
    { 
     map textures/common/lava.tga 
    } 
} 

正如你所看到的,結構是:

shadername 
{ 
    directive 
    directive 
    //.... 
    { 
     directive 
     //... 
    } 
} 

我的問題

正如你所看到的,一個指令是由一個鍵和一些參數組成。鍵和參數是已知的(可能有超過100個鍵)。我想知道如何爲一個指令(鍵+參數)設置一個全局規則,並在它旁邊指定所有的規則。而且,如果我可以將它們全部放在不同的文件中以保持清晰的語法,那就更好了。

我有什麼,現在

parser grammar ShaderParser; 

options { 
    tokenVocab=ShaderLexer; 
} 

shaderlist 
    : shader+ 
    ; 

shader 
    : shadername LBracket directive* stage* RBracket 
    ; 

shadername 
    : Path CompileTime? 
    ; 

stage 
    : LBracket directive* RBracket 
    ; 

directive 
    : key parameter? 
    | key DQuote parameter DQuote 
    | key SQuote parameter SQuote 
    ; 

key 
    : Word 
    ; 

parameter 
    : Word 
    | Integer 
    | Double 
    | Path 
    ; 

該指令,密鑰和參數(單一個用於測試)規則只是用於獲取的主要語法。

感謝您的幫助!

回答

0

語法似乎需要換行符聲明分隔符。您應該在每條指令的末尾添加它們。同樣,你可以用你的語法匹配的參數最多隻有一個。

shader 
    : shadername NEWLINE 
     LBracket NEWLINE 
     directive* 
     stage* 
     RBracket NEWLINE? 
     EOF 
    ; 

shadername 
    : Path CompileTime? 
    ; 

stage 
    : LBracket NEWLINE 
     directive* 
     RBracket NEWLINE 
    ; 

directive 
    : key mayBeQuotedParameter* NEWLINE 
    ; 

mayBeQuotedParameter 
    : parameter? 
    | DQuote parameter DQuote 
    | SQuote parameter SQuote   
    ; 

key 
    : Word 
    ; 

parameter 
    : Word 
    | Integer 
    | Double 
    | Path 
    ;