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