2014-02-06 30 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 
    ;