我想使用pypeg2来解析c#代码。所以我必须首先定义C#语法。我对解析表达式语法(PEG)知之甚少,并假设它与Backus-Naur形式(BNF)有很多共同之处。 BNF允许递归,所以我定义了这样的语法:
from __future__ import unicode_literals,print_function
from pypeg2 import *
class Instruction(list):
grammar = Enum(word,IfDefinition),";",endl
class IfDefinition(list):
grammar = "if",block,"else",block
block = "{",maybe_some(Instruction),"}"
当我尝试执行代码时,我遇到了错误“NameError:name'FifDefinition'未定义”。如果在定义它之前我没有使用“IfDefinition”,我就无法构造多层嵌套的“IfDefinition”。我想知道如何使用pypeg2定义if表达式的语法。
答案 0 :(得分:1)
看起来你有一个周期,(Instruction
引用IfDefinition
,IfDefinition
引用block
和block
引用Instruction
。)< / p>
我认为您可能需要重新考虑您使用的模型,或者可能的,稍微混乱的解决方案
class Instruction(list):
pass
block = "{",maybe_some(Instruction),"}"
class IfDefinition(list):
grammar = "if",block,"else",block
Instruction.grammar = Enum(word,IfDefinition),";",endl