Gocc可以忽略词法分析器中的东西



有没有方法告诉gocc忽略词法分析器中的东西?例如,对于

2022-01-18 11:33:21.9885 [21] These are strings that I need to egnore, until - MYKW - Start Active One: 1/18/2022 11:33:21 AM

我想告诉gocc[21]一直忽略到until。以下是我一直在尝试的:

/* Lexical part */
_letter : 'A'-'Z' | 'a'-'z' | '_' ;
_digit : '0'-'9' ;
_timestamp1 : _digit | ' ' | ':' | '-' | '.' ;
_timestamp2 : _digit | ' ' | ':' | '/' | 'A' | 'P' | 'M' ;
_ignore :  '['  { . } ' '  '-'  ' '  'M'  'Y'  'K'  'W'  ' '  '-'  ' ' ;
_lineend : [ 'r' ] 'n' ;

timestamp       : _timestamp1 { _timestamp1 } _ignore ;
taskLogStart    : 'S'  't'  'a'  'r'  't'  ' ' ;
jobName     : { . } _timestamp2 { _timestamp2 } _lineend ;

/* Syntax part */
Log
: timestamp taskLogStart jobName ;

但是,解析程序在以下位置失败:

error: expected timestamp; got: unknown/invalid token "2022-01-18 11:33:21.9885 [21] T"

我认为它应该起作用的原因是,以下忽略规则对空白非常适用:

!lineComment  : '/' '/' { . } 'n' ;
!blockComment : '/' '*' { . | '*' } '*' '/' ;

我只是把上面的规则应用到我的普通文本解析中。

它不是那样工作的--

EBNF看起来很像正则表达式,但它根本不像正则表达式——我的意思是,

线路,

2022-01-18 11:33:21.9885 [21] These are strings that I need to ignore, until - MYKW - Start Active One: 1/18/2022 11:33:21 AM

如果要与正则表达式匹配,它可以简单地为:

([0-9.: -]+).*? - MYKW - Start ([^:]+):.*$

然而,这不能像那样直接转化为EBNF定义,因为正则表达式依赖于每个元素之间的上下文来ping匹配(例如,.*?匹配规则是一个仅基于其所在上下文工作的本地规则(,然而,gocc是一个LR解析器,这是一个上下文无关的语法!!!

基本上,上下文无关语法意味着,每次它试图与所有现有的词汇符号进行.*匹配时(即,每个词汇符号都可以被视为不受其所处上下文影响的全局规则(。我无法完全描述它,但在下一场比赛中并没有之前的上下文(或后面的符号(。这就是OP失败的原因。

有关如何使用"{.}"的真实示例,请参阅

如何在正式的BNF中描述此事件日志?

最新更新