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