强制和可选空格

发布于 2024-12-26 22:41:32 字数 739 浏览 3 评论 0原文

我需要解析这样的字符串:

"qqq www eee" -> "qqq", "www", "eee" (case A)
"qqq   www  eee" -> "qqq", "www", "eee" (case B)

这是我当前拥有的语法:

grammar Query;

SHORT_NAME : ('a'..'z')+ ;

name returns [String s]: SHORT_NAME { $s = $SHORT_NAME.text; };      

names 
    returns [List<String> v]
    @init { $v = new ArrayList<String>(); }
    : name1 = name { $v.add($name1.s); } 
      (' ' name2 = name { $v.add($name2.s); })*;

它对于 caseA 工作正常,但对于 caseB 失败:

line 1:4 missing SHORT_NAME at ' '
line 1:5 extraneous input ' ' expecting SHORT_NAME
line 1:10 extraneous input ' ' expecting SHORT_NAME

有什么想法如何让它工作吗?

I need to parse strings like this:

"qqq www eee" -> "qqq", "www", "eee" (case A)
"qqq   www  eee" -> "qqq", "www", "eee" (case B)

Here's the grammar I currently have:

grammar Query;

SHORT_NAME : ('a'..'z')+ ;

name returns [String s]: SHORT_NAME { $s = $SHORT_NAME.text; };      

names 
    returns [List<String> v]
    @init { $v = new ArrayList<String>(); }
    : name1 = name { $v.add($name1.s); } 
      (' ' name2 = name { $v.add($name2.s); })*;

It works fine for caseA, but fails for caseB:

line 1:4 missing SHORT_NAME at ' '
line 1:5 extraneous input ' ' expecting SHORT_NAME
line 1:10 extraneous input ' ' expecting SHORT_NAME

Any ideas how to make it work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白鸥掠海 2025-01-02 22:41:32

names 规则中删除文字 ' ' 并将其替换为 SPACES 标记:

grammar Query;

SPACES
 : (' ' | '\t')+
 ;

SHORT_NAME 
 : ('a'..'z')+ 
 ;

name returns [String s]
 : SHORT_NAME { $s = $SHORT_NAME.text; }
 ;      

names returns [List<String> v]
@init { $v = new ArrayList<String>(); }
 : a=name { $v.add($a.s); } (SPACES b=name { $v.add($b.s); })*
 ;

或者简单地丢弃词法分析器级别的空格,以便您不需要将它们放入解析器规则中:

grammar Query;

SPACES
 : (' ' | '\t')+ {skip();}
 ;

SHORT_NAME 
 : ('a'..'z')+ 
 ;

name returns [String s]
 : SHORT_NAME { $s = $SHORT_NAME.text; }
 ;      

names returns [List<String> v]
@init { $v = new ArrayList<String>(); }
 : (name { $v.add($b.s); })+
 ;

Remove the literal ' ' from your names rule and replace it with a SPACES token:

grammar Query;

SPACES
 : (' ' | '\t')+
 ;

SHORT_NAME 
 : ('a'..'z')+ 
 ;

name returns [String s]
 : SHORT_NAME { $s = $SHORT_NAME.text; }
 ;      

names returns [List<String> v]
@init { $v = new ArrayList<String>(); }
 : a=name { $v.add($a.s); } (SPACES b=name { $v.add($b.s); })*
 ;

Or simply discard the spaces at the lexer-level so that you don't need to put them in your parser rules:

grammar Query;

SPACES
 : (' ' | '\t')+ {skip();}
 ;

SHORT_NAME 
 : ('a'..'z')+ 
 ;

name returns [String s]
 : SHORT_NAME { $s = $SHORT_NAME.text; }
 ;      

names returns [List<String> v]
@init { $v = new ArrayList<String>(); }
 : (name { $v.add($b.s); })+
 ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文