首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >句子的词条规则

句子的词条规则
EN

Stack Overflow用户
提问于 2015-02-09 11:47:33
回答 2查看 473关注 0票数 0

我知道lexer的规则是匹配单词,而不是句子。但是否有可能做到。因为我的输入有如下格式

代码语言:javascript
复制
ADD FILE first-doc VERSION 1 TYPE sequential FIXED 23 BLOCK 23 MODE 
ebdic LABEL standard KEY REC_NR#09545 RULE DOMANI _ scorebestand MKC

花药输入可能有类似的

代码语言:javascript
复制
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 

在上述两种输入中,我的解析器规则如下所示

代码语言:javascript
复制
add_file   :
'ADD FILE' file=String 'VERSION' ver=Integer 'TYPE' String 
'FIXED' Integer 'BLOCK' Integer 'MODE' codePage=String
'LABEL' String KEY  key=String ;

我能够把关键写下来,因为所有的东西都是一个单词,但不能继续按规则前进,因为它随句子的不同而变化。

就连我也试着用贪婪的火柴

代码语言:javascript
复制
All   : .*;

但这对我来说是个错误。

上述状态的词法规则

代码语言:javascript
复制
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中我才能做到这一点吗?我才两周大,请帮忙。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 12:28:48

下面的ANTLR4解析器规则读取行尾之前的所有内容。

代码语言:javascript
复制
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规则。你必须去掉目标语言中的“规则”。

代码语言:javascript
复制
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文档)。希望这能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 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'|'-'|'#'|':')*;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28409055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档