消除给定ANTLR语法中的额外空格

消除给定ANTLR语法中的额外空格,antlr,Antlr,在我在ANTLR中创建的任何语法中,是否可以解析语法,并且解析的结果可以删除语法中的任何额外空格。f、 e 简单的例子 int x=5; 如果我写 int x = 5 ; 我希望文本更改为int x=5,而不需要额外的空格。解析器可以返回原始文本而不需要额外的空格吗 解析器可以返回原始文本而不需要额外的空格吗 是的,您需要定义一个lexer规则来捕获这些空格,然后skip() Space : (' ' | '\t') {skip();}

在我在ANTLR中创建的任何语法中,是否可以解析语法,并且解析的结果可以删除语法中的任何额外空格。f、 e

简单的例子

int x=5;
如果我写

int x      =          5         ; 
我希望文本更改为int x=5,而不需要额外的空格。解析器可以返回原始文本而不需要额外的空格吗

解析器可以返回原始文本而不需要额外的空格吗

是的,您需要定义一个lexer规则来捕获这些空格,然后
skip()

Space
  :  (' ' | '\t') {skip();}
  ;
这将导致忽略空格和制表符

另外,我假设您使用Java作为目标语言。
skip()
在其他目标中可能有所不同(例如,对于C#,skip()
)。您可能还希望在此规则中包含
\r
\n
字符

编辑 假设您的语言只包含两个变量声明。假设您了解ANTLR的基础知识,以下语法应该很容易理解:

grammar T;

parse
  :  stat* EOF
  ;

stat
  :  Type Identifier '=' Int ';'
  ;

Type
  :  'int'
  |  'double'
  |  'boolean'
  ;

Identifier
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

Int
  :  '0'..'9'+
  ;

Space
  :  (' ' | '\t' | '\n' | 'r')+ {skip();}
  ; 
您正在分析源代码:

int x   =      5     ; double y     =5;boolean z      =    0  ;
您希望将其更改为:

int x=5;
double y=5;
boolean z=0;
下面是一种在语法中嵌入代码并让解析器规则返回自定义对象(本例中为字符串)的方法:

使用以下类对其进行测试:

import org.antlr.runtime.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String source = "int x   =      5     ; double y     =5;boolean z      =    0  ;";
        ANTLRStringStream in = new ANTLRStringStream(source);
        TLexer lexer = new TLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);
        System.out.println("Result:\n"+parser.parse());
    }
}
产生:

Result:
int x=5;
double y=5;
boolean z=0;

谢谢你的回答,但我的问题与skip()无关。当我使用java应用程序的输入CharStream CharStream=new AntlStringStream(“intx=5;”)时,我创建了一个小dsl;XLLexer lexer=新的XLLexer(charStream);TokenStream TokenStream=新的CommonTokenStream(lexer);XLParser parser=新的XLParser(令牌流);parser.program();系统输出打印项次(“完成”);我希望解析器成功解析,同时返回int x=5;如果没有空格,这正是
skip()
所做的:它会导致从解析器中删除这些空格。换句话说,如果您在lexer中包含这个规则,那么您就不必在解析器规则中担心它们。如果你的意思不同,我不明白你的意思。:)假设我有一个Java应用程序,其中有一个文本区域,我在其中编写这个DSL(int x=5;)(中间有额外的空格),我有一个按钮,上面写着parse。我希望当我按下parse按钮时,文本区域中的文本也被格式化,没有额外的空间。因此,解析器可以返回文本int x=5;这可以在java中完成,但我认为当解析从DSL获取令牌os字符串并只读取它需要的信息时,可能会以某种方式返回此信息。我不确定你是否理解我想要的,但我希望你理解:)好吧,解析器只“知道”关于
int
x
=
5
分别显示。它不知道您只需要
int
x
之间的一个空格。因此,不可能从解析器中提取您想要的内容。这可以通过在解析器中嵌入代码并返回标记的内容,其中包含您想要的空格,但是您必须学习一点ANTLR。
Result:
int x=5;
double y=5;
boolean z=0;