句子的词法分析规则
Lexer rule for a sentence
我知道词法分析器规则是匹配单词而不是句子。但是有没有可能做到。因为我的输入格式如下
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 ;
我能写到 KEY,因为一切都是单个单词,但无法继续使用 RULE,因为它随句子而变化
我什至尝试过贪心匹配
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 中实现吗?我对这个 ANTLR 只有两周大
请帮忙
提前致谢
下面的 ANTLR4 parser 规则读取所有内容,直到行尾。
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 : '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 规则,请查看 island grammars(link 到 ANTLR3 文档)。 '希望这有帮助!
我想到了另一种解析 Sentence 的方法,只需在末尾添加 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*;
//字符串的词法分析器规则
String: ('a'..'z'|'A'..'Z'|'-'|'#'|':') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#'|':')*;
我知道词法分析器规则是匹配单词而不是句子。但是有没有可能做到。因为我的输入格式如下
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 ;
我能写到 KEY,因为一切都是单个单词,但无法继续使用 RULE,因为它随句子而变化
我什至尝试过贪心匹配
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 中实现吗?我对这个 ANTLR 只有两周大 请帮忙
提前致谢
下面的 ANTLR4 parser 规则读取所有内容,直到行尾。
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 : '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 规则,请查看 island grammars(link 到 ANTLR3 文档)。 '希望这有帮助!
我想到了另一种解析 Sentence 的方法,只需在末尾添加 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*;
//字符串的词法分析器规则
String: ('a'..'z'|'A'..'Z'|'-'|'#'|':') ('a'..'z'|'A'..'Z'|'0'..'9'|'-'|'#'|':')*;