在名为Parser的类中实现名为“LineCode”的内部私有枚举类遇到问题。在
LineCode:私有枚举类,定义6种一般可能的代码行类型。我使用枚举实例化发送一个Regex模式,并在构造函数中编译它,然后将Regex匹配器作为类变量保存。在
解析器:解析编程语言,与什么语言无关。解析器使用LineCode来标识行并相应地继续。在
问题:我无法从静态方法访问\u LineCode的枚举成员。
我希望有一个静态的方法在yu LineCode中,“matchLineCode(line)”,它从解析器接收一个字符串,然后在以下逻辑中迭代枚举成员:如果找到匹配项:返回枚举
如果没有剩余的枚举:返回无
这似乎不是小事,我不能访问enum成员来完成这项工作。在
尝试:我尝试使用以下方法迭代枚举:__行代码。成员\值()
解析器。行代码。成员。值()
两个都失败了,因为找不到\uuu lineCode。在
理想情况下:LineCode类必须是私有的,并且对于导入解析器的任何其他类都不可见。解析器必须使用LineCode类提供的静态方法来返回枚举。我愿意接受任何解决这个问题的解决方案或是模仿这种行为的解决方案。在
为了提高可读性,我省略了一些无关的解析器方法。
代码:class Parser:
class __LineCode(Enum):
STATEMENT = ("^\s*(.*);\s*$")
CODE_BLOCK = ("^\s*(.*)\s*\{\s*$")
CODE_BLOCK_END = ("^\s*(.*)\s*\}\s*$")
COMMENT_LINE = ("^\s*//\s*(.*)$")
COMMENT_BLOCK = ("^\s*(?:/\*\*)\s*(.*)\s*$")
COMMENT_BLOCK_END = ("^\s*(.*)\s*(?:\*/)\s*$")
BLANK_LINE = ("^\s*$")
def __init__(self, pattern):
self.__matcher = re.compile(pattern)
@property
def matches(self, line):
return self.__matcher.match(line)
@property
def lastMatch(self):
try:
return self.__matcher.groups(1)
except:
return None
@staticmethod
def matchLineCode(line):
for lineType in **???**:
if lineType.matches(line):
return lineType
return None
def __init__(self, source=None):
self.__hasNext = False
self.__instream = None
if source:
self.__instream = open(source)
def advance(self):
self.__hasNext = False
while not self.__hasNext:
line = self.__instream.readline()
if line == "": # If EOF
self.__closeFile()
return
lineCode = self.__LineCode.matchLineCode(line)
if lineCode is self.__LineCode.STATEMENT:
pass
elif lineCode is self.__LineCode.CODE_BLOCK:
pass
elif lineCode is self.__LineCode.CODE_BLOCK_END:
pass
elif lineCode is self.__LineCode.COMMENT_LINE:
pass
elif lineCode is self.__LineCode.COMMENT_BLOCK:
pass
elif lineCode is self.__LineCode.COMMENT_BLOCK:
pass
elif lineCode is self.__LineCode.BLANK_LINE:
pass
else:
pass # TODO Invalid file.
我已经用Java实现了,我想在Python中重建同样的东西:
^{pr2}$
谢谢。在