2014-06-07 5 views
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 
+0

입력, 잘못된 출력 및 원하는 출력을 제공 할 수 있습니까? – cpburnz

+0

입력 : "" "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

답변

1

난 당신이 next_token() 방법을 변경하려는 생각 NEWLINE 또는 SKIP이 발생하면 다른 토큰을 구문 분석합니다. 에드. 예 :

def next_token(self): 
    keywords = {'digraph', 'subgraph', 'node', 'edge', 'strict', 'graph'} 

    # Parse next token. 
    self.tokenize() 
    while self.c == "SKIP" or self.c == "NEWLINE": 
     # Discard this token and parse another token. 
     self.tokenize() 

    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)) 
+0

대단히 감사합니다. 이것은 내가 찾고있는 것입니다 .. 다시 한번 감사드립니다 :) – user3704723