我知道lexer的规则是匹配单词,而不是句子。但是否有可能做到。因为我的输入有如下格式
ADD FILE first-doc VERSION 1 TYPE sequential FIXED 23 BLOCK 23 MODE
ebdic LABEL standard KEY REC_NR#09545 RULE DOMANI _ scorebestand MKC花药输入可能有类似的
ADD FILE secound-doc VERSION 3 TYPE normal FIXED 39 BLOCK 39 MODE
gdieds LABEL constant KEY CTR-NR#62872
RULE CBTPSN49 : dagextract (loadfile) met key PIB_KLN_NR 在上述两种输入中,我的解析器规则如下所示
add_file :
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
'LABEL' String KEY key=String ;我能够把关键写下来,因为所有的东西都是一个单词,但不能继续按规则前进,因为它随句子的不同而变化。
就连我也试着用贪婪的火柴
All : .*;但这对我来说是个错误。
上述状态的词法规则
WhiteSpace: ('\r' | '\t' | '\u000C' | '\n' | ' ') { $channel=HIDDEN; };
COMMENT:('**'.*'\n'|'REMARKS'.*'\n')*{skip();};
String: ('a'..'z'|'A'..'Z'|'-'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#')*;
Integer: '-'? ('0' | '1'..'9' ('0'..'9')*);我的问题是“是否可以将多个单词与一个词条规则相匹配?如果可以,如何做到这一点?”
只有在ANTLR 4中我才能做到这一点吗?我才两周大,请帮忙。
提前感谢
发布于 2015-02-09 12:28:48
下面的ANTLR4解析器规则读取行尾之前的所有内容。
add_file :
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
'LABEL' String 'KEY' key=String 'RULE' expr=everything_until_CR '\r'? '\n'?;
everything_until_CR : ~('\n'|'\r')* ;不幸的是,在ANTLR3中,这似乎行不通。下面提出了一个解决办法-- lexer规则。你必须去掉目标语言中的“规则”。
RULE : 'RULE ' ~('\n'|'\r')* ;
add_file :
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
'LABEL' String 'KEY' key=String
expr=RULE '\r'? '\n'? {System.out.println($expr.text.substring(5));}
;如果您确实需要上下文敏感的lexer规则,请查看岛语法 (链接到ANTLR3文档)。希望这能帮上忙!
发布于 2015-02-13 03:48:11
我想出了另一种方法来解析句子,只需在末尾添加String*。请看我下面的语法,它缝得很好。
add_file : 'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String 'LABEL' String 'KEY' key=String 'RULE' String*;
字符串的//Lexer规则
String: ('a'..'z'|'A'..'Z'|'-'|'#'|':') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#'|':')*;
https://stackoverflow.com/questions/28409055
复制相似问题