QParserGenerator的文法文件介绍在沉默了数月之后,博主心血来潮想继续介绍QParserGenerator,在这里我们将不再继续介绍任何有关于LALR(1)的算法(那东西只会把你的脑子变成一团浆糊),让我们来看一下QParserGenerator的具体用法。 %token "%" "token" "start" "|" "-" ">" ";" "[" "]";
%start start; strings -> strings "{String}" | "{String}" ; vs -> vs "{Letter}" | vs "{String}" | "{Letter}" | "{String}" ; option -> "[" vs "]" ; oneProductionRight -> oneProductionRight option | oneProductionRight vs | option | vs ; someProductionRight -> someProductionRight "|" oneProductionRight | oneProductionRight ; token -> "%" "token" strings ";" ; someTokens -> someTokens token | token ; production -> "{Letter}" "-" ">" someProductionRight ";" ; someProductions -> someProductions production | production ; start -> someTokens "%" "start" "{Letter}" ";" someProductions | "%" "start" "{Letter}" ";" someProductions ;
也许有人会问,不对啊根据维基百科上的说明BNF不应该是长这样的,其实QParserGenerator是一个BNF的生成器,它可以将输入的BNF通过一系列的运算最后生成LALR(1)分析表,为了BNF文件的美观和方便处理我特地把他设计成了这个样子的而已,好了下面我们就以这个BNF文件来说明应该如何来书写BNF文件。 start -> someTokens "%" "start" "{Letter}" ";" someProductions
| "%" "start" "{Letter}" ";" someProductions ;
可以看到所有的规则可分为左半部分和右半部分,左边总是一个非终结符来说明他应该被哪一些规则来替代,而右边则是这些规则的具体内容包含了一些终结符和非终结符序列,中间则用一个箭头符号来分割。在所有的规则中非终结符都是不带引号的,而终结符都是用引号将其括起来的,在终结符中有一些内置的变量来表达一些特定的表达式,这个会在下文中做出说明。当然对于同一个终结符来说我们可以用任意多个规则来说明他,他们都是或的关系,由于BNF中不可能存在且的关系,应此我们并不需要考虑他。 1 vs -> vs "{Letter}"
2 | vs "{String}" 3 | "{Letter}" 4 | "{String}" 5 ; 6 7 option -> "[" vs "]" 8 ;
1 oneProductionRight -> oneProductionRight option
2 | oneProductionRight vs 3 | option 4 | vs 5 ; 6 7 someProductionRight -> someProductionRight "|" oneProductionRight 8 | oneProductionRight 9 ;
|
|