2015-08-28 4 views
0

Я пытаюсь разобрать эту часть заголовка электронной почты:ANTLR4: разбор заголовка сообщения, предпросмотр не работает, цель Python

Received: from server.mymailhost.com (mail.mymailhost.com [126.43.75.123]) by pilot01.cl.msu.edu (8.10.2/8.10.2) with ESMTP id NAA23597;Fri, 12 Jul 2002 16:11:20 -0400 (EDT) 

Я хочу лексер, чтобы разметить его в эти части:

Received: 

from server.mymailhost.com (mail.mymailhost.com [126.43.75.123]) 

by pilot01.cl.msu.edu (8.10.2/8.10.2) 

with ESMTP 

id NAA23597 

; 

Fri, 12 Jul 2002 16:11:20 -0400 (EDT) 

<EOF> 

Вот мой парсер грамматики:

parser grammar MyParser;     

options { tokenVocab=MyLexer; }   

received : Received fromToken byToken withToken idToken SemiColon date EOF ; 

fromToken : FromText ; 

byToken: ByText ; 

withToken : WithText ; 

idToken : IdText ; 

date : DateContents+ ; 

Ниже моя лексер грамматика. Это ошибка, которую я получаю, когда я бегу ANTLR:

token recognition error at: 'from server.mymailhost.com (mail.mymailhost.com [126.43.75.123]) by pilot01.cl.msu.edu (8.10.2/8.10.2) with ESMTP id NAA23597;Fri, 12 Jul 2002 16:11:20 -0400 (EDT)' 

mismatched input '<EOF>' expecting FromText 

Видимо лексер успешно, получая первый маркер (Received:), но затем не получает следующую лексему (From:). Обратите внимание, что в лексической грамматике я использую lookahead; я использую его правильно? Любые мысли о том, что проблема?

lexer grammar MyLexer;     

Received : 'Received: ' ; 
SemiColon : ';' ; 

FromText : 'from ' .+? 
     { 
     (self.input.LA(1) == 'b') and (self.input.LA(2) == 'y') 
     }? ; 

ByText : 'by '.+? 
     { 
     (self.input.LA(1) == 'w') and (self.input.LA(2) == 'i') and (self.input.LA(3) == 't') and (self.input.LA(4) == 'h') 
     }? ; 

WithText : 'with ' .+? 
     { 
     (self.input.LA(1) == 'i') and (self.input.LA(2) == 'd') 
     }? ; 

IdText : 'id ' .+? 
     { 
     (self.input.LA(1) == ';') 
     }? ; 

DateContents : ('Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat' | 'Sun') (Letter | Number | Special)+ ; 

fragment Letter : 'A'..'Z' | 'a'..'z' ; 

fragment Number : '0'..'9' ; 

fragment Special : ' ' | '_' | '-' | '.' | ',' | '~' | ':' | '+' | '$' | '=' | '(' | ')' | '[' | ']' | '/' ; 

Whitespace : [\t\r\n]+ -> skip ; 

ответ

0

После долгих усилий я понял ответ. Ниже приведен рабочий лексер:

lexer grammar MyLexer;     

Received : 'Received: ' ; 
SemiColon : ';' ; 

FromText : 'from ' .+? 
     {(self._input.LA(1) == ord('b')) and (self._input.LA(2) == ord('y'))}? 
     ; 

ByText : 'by '.+? 
     {(self._input.LA(1) == ord('w')) and (self._input.LA(2) == ord('i')) and (self._input.LA(3) == ord('t')) and (self._input.LA(4) == ord('h'))}? 
     ; 

WithText : 'with ' .+? 
     {(self._input.LA(1) == ord('i')) and (self._input.LA(2) == ord('d'))}? 
     ; 

IdText : 'id ' .+? 
     {(self._input.LA(1) == ord(';'))}? 
     ; 

DateContents : ('Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat' | 'Sun') (Letter | Number | Special)+ ; 

fragment Letter : 'A'..'Z' | 'a'..'z' ; 

fragment Number : '0'..'9' ; 

fragment Special : ' ' | '_' | '-' | '.' | ',' | '~' | ':' | '+' | '$' | '=' | '(' | ')' | '[' | ']' | '/' ; 

Whitespace : [\t\r\n]+ -> skip ; 
Смежные вопросы