有没有方法告诉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中描述此事件日志?