如何制作“全局解析器规则”?

时间:2014-02-06 08:04:39

标签: antlr4

我正在构建一个用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 
    ;

指令,键和参数(一个用于测试的规则)规则只是用于获取主语法。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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 
    ;        
相关问题