【发布时间】:2014-06-07 01:43:30
【问题描述】:
我下面的词法分析器代码在应该隐藏它们的地方同时生成“SKIP”和“NEWLINE”值。有人可以告诉我该怎么做才能隐藏它们吗?
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
get_token = re.compile(tok_regex, re.DOTALL).match
mo = get_token(self.input, self.p)
self.p = mo.end()
if self.p >= len(self.input):
self.c = "EOF"
else:
if mo is not None:
self.c = mo.lastgroup
self.val = mo.group(self.c)
if self.c == 'NEWLINE':
self.line += 1
def next_token(self):
keywords = {'digraph', 'subgraph', 'node', 'edge', 'strict', 'graph'}
self.tokenize()
if self.c != 'SKIP' and self.c != "NEWLINE":
if self.c == 'ID' and self.val in keywords:
self.c = self.val
return TokenTypes.Token(self.c, self.val)
# if self.p != len(self.input):
# raise RuntimeError('Unexpected character %r on line %d' %(self.input[self.p], self.line))
def main():
statements = '''
digraph G {
main [shape=box];
}
'''
lexer = Lexer(statements)
t = lexer.next_token()
i = 0
while (t.typ != "EOF"):
i += 1
print(t)
t = lexer.next_token()
if __name__ == "__main__":
sys.exit(main())
我正在尝试通过从上述词法分析器导入标记来为点语法生成抽象语法树。但是不需要的 SKIP 和 NEWLINE 令牌正在制造麻烦。
这是一个示例输入:
digraph G { main [shape=box]; }
产生输出:
NEWLINE digraph SKIP ID SKIP LBRACE NEWLINE ID SKIP LBRACKET ID EQUAL ID RBRACKET END SKIP NEWLINE SKIP RBRACE
但它应该输出:
digraph ID LBRACE ID LBRACKET ID EQUAL ID RBRACKET END RBRACE
【问题讨论】:
-
你能举个例子输入,不正确的输出,和想要的输出吗?
-
输入:"""digraph G { main [shape=box]; }""" 。输出不正确:NEWLINE digraph SKIP ID SKIP LBRACE NEWLINE ID SKIP LBRACKET ID EQUAL ID RBRACKET END SKIP NEWLINE SKIP RBRACE。所需输出:有向图 ID LBRACE ID LBRACKET ID EQUAL ID RBRACKET END RBRACE
标签: python abstract-syntax-tree lexer dot