1
아래의 렉서 코드는 숨기기로되어있는 "건너 뛰기"와 "새 라인"값을 생성합니다. 누군가가 그들을 숨기기 위해 무엇을해야하는지 말해 줄 수 있습니까? SKIP 및 NEWLINE 값을 토큰 화하는 Lexer입니다. 그들을 숨기는 방법?
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
입력, 잘못된 출력 및 원하는 출력을 제공 할 수 있습니까? – cpburnz
입력 : "" "digraph G { main [shape = box]; }" "" 올바르지 않은 출력 : NEWLINE 자필 글자 ID SKIP LBRACE NEWLINE ID SKIP LBRACKET ID 동일 ID RBRACKET END SKIP NEWLINE SKIP RBRACE. 원하는 출력 : 자필 ID LBRACE ID LBRACKET ID 동등 ID RBRACKET END RBRACE – user3704723