gpt4 book ai didi

parsing - 帮助解析日志文件 (ANTLR3)

转载 作者:行者123 更新时间:2023-12-02 18:16:12 26 4
gpt4 key购买 nike

我需要一些指导来编写语法来解析游戏《永恒之塔》的日志文件。我决定使用 Antlr3(因为它似乎是一个可以完成这项工作的工具,并且我认为学习使用它对我有好处)。但是,我遇到了问题,因为日志文件的结构不准确。

我需要解析的日志文件如下所示:

2010.04.27 22:32:22 : You changed the connection status to Online. 
2010.04.27 22:32:22 : You changed the group to the Solo state.
2010.04.27 22:32:22 : You changed the group to the Solo state.
2010.04.27 22:32:28 : Legion Message: www.xxxxxxxx.com (forum)



ventrillo: 19x.xxx.xxx.xxx

Port: 3712

Pass: xxxx (blabla)

4/27/2010 7:47 PM
2010.04.27 22:32:28 : You have item(s) left to settle in the sales agency window.

如您所见,大多数行都以时间戳开头,但也有异常(exception)。我想在 Antlr3 中做的是编写一个解析器,仅使用以时间戳开头的行,同时默默地丢弃其他行。

这就是我到目前为止所写的内容(我是这些东西的初学者,所以请不要笑:D)

grammar Antlr;

options {
language = Java;
}

logfile: line* EOF;

line : dataline | textline;

dataline: timestamp WS ':' WS text NL ;
textline: ~DIG text NL;

timestamp: four_dig '.' two_dig '.' two_dig WS two_dig ':' two_dig ':' two_dig ;

four_dig: DIG DIG DIG DIG;
two_dig: DIG DIG;

text: ~NL+;

/* Whitespace */
WS: (' ' | '\t')+;

/* New line goes to \r\n or EOF */
NL: '\r'? '\n' ;

/* Digits */
DIG : '0'..'9';

所以我需要的是一个示例,说明如何解析它而不会对没有时间戳的行生成错误。

谢谢!

最佳答案

没有人会笑。事实上,你的第一次尝试就做得很好了。当然,还有改进的空间! :)

首先一些说明:您只能否定单个字符。由于您的 NL 规则可能包含两个字符,因此您无法否定它。另外,当从解析器规则中进行否定时,您不会否定单个字符,而是否定词法分析器规则。这听起来可能有点令人困惑,所以让我用一个例子来澄清。采用组合(解析器和词法分析器)语法T:

grammar T;

// parser rule
foo
: ~A
;

// lexer rules
A
: 'a'
;

B
: 'b'
;

C
: 'c'
;

如您所见,我否定了 foo 解析器规则中的 A 词法分析器规则。 foo 规则现在匹配除 'a' 之外的任何字符,但它匹配除 A 之外的任何词法分析器规则>。换句话说,它只会匹配 'b''c' 字符。

此外,您不需要输入:

options {
language = Java;
}

在你的语法中:默认目标是Java(当然将其保留在那里也没有什么坏处)。

现在,在您的语法中,您已经可以区分词法分析器语法中的 data 行和 text 行。这是一种可能的方法:

logfile
: line+
;

line
: dataline
| textline
;

dataline
: DataLine
;

textline
: TextLine
;

DataLine
: TwoDigits TwoDigits '.' TwoDigits '.' TwoDigits Space+ TwoDigits ':' TwoDigits ':' TwoDigits Space+ ':' TextLine
;

TextLine
: ~('\r' | '\n')* (NewLine | EOF)
;

fragment
NewLine
: '\r'? '\n'
| '\r'
;

fragment
TwoDigits
: '0'..'9' '0'..'9'
;

fragment
Space
: ' '
| '\t'
;

请注意,词法分析器规则中的 fragment 部分意味着不会从这些规则创建任何标记:它们仅在其他词法分析器规则中使用。因此词法分析器只会创建两种不同类型的标记:DataLineTextLine

关于parsing - 帮助解析日志文件 (ANTLR3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com