我的ANTLR代码如下:
LPARENTHESIS : ('(');
RPARENTHESIS : (')');
fragment CHARACTER : ('a'..'z'|'0'..'9'|);
fragment QUOTE : ('"');
fragment WILDCARD : ('*');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C'|';'|':'|',');
WILD_STRING
: (CHARACTER)*
(
('?')
(CHARACTER)*
)+
;
PREFIX_STRING
: (CHARACTER)+
(
('*')
)+
;
WS : (SPACE) { $channel=HIDDEN; };
PHRASE : (QUOTE)(LPARENTHESIS)?(WORD)(WILDCARD)?(RPARENTHESIS)?((SPACE)+(LPARENTHESIS)?(WORD)(WILDCARD)?(RPARENTHESIS)?)*(SPACE)+(QUOTE);
WORD : (CHARACTER)+;
我想要做的是将所有标记为空格的字符替换为PHRASE中的实际空格字符。如果可能的话,我希望所有连续的空格都用一个空格来表示。
任何帮助都将非常感激。出于某种原因,我发现很难理解ANTLR。有什么好的教程吗?
答案 0 :(得分:3)
调用lexer's setText(...)
method:
grammar T;
parse
: words EOF {System.out.println($words.text);}
;
words
: Word (Spaces Word)*
;
Word
: ('a'..'z'|'A'..'Z')+
;
Spaces
: (' ' | '\t' | '\r' | '\n')+ {setText(" ");}
;
可以在课堂上测试:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
String source = "This is \n just \t\t\t\t\t\t a \n\t\t test";
ANTLRStringStream in = new ANTLRStringStream(source);
TLexer lexer = new TLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TParser parser = new TParser(tokens);
System.out.println("------------------------------\nSource:\n" + source +
"\n------------------------------\nAfter parsing:");
parser.parse();
}
}
产生以下输出:
------------------------------
Source:
This is
just a
test
------------------------------
After parsing:
This is just a test
Puneet Pawaia 写道:
任何帮助都将非常感激。出于某种原因,我发现很难理解ANTLR。有什么好的教程吗?
ANTLR Wiki有大量信息性信息,虽然有点非结构化(但可能只是我!)。
最好的ANTLR教程是书:The Definitive ANTLR Reference: Building Domain-Specific Languages。
对于C#目标,请尝试:
grammar T;
options {
language=CSharp2;
}
@parser::namespace { Demo }
@lexer::namespace { Demo }
parse
: words EOF {Console.WriteLine($words.text);}
;
words
: Word (Spaces Word)*
;
Word
: ('a'..'z'|'A'..'Z')+
;
Spaces
: (' ' | '\t' | '\r' | '\n')+ {Text = " ";}
;
与测试类:
using System;
using Antlr.Runtime;
namespace Demo
{
class MainClass
{
public static void Main (string[] args)
{
ANTLRStringStream Input = new ANTLRStringStream("This is \n just \t\t\t\t\t\t a \n\t\t test");
TLexer Lexer = new TLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
TParser Parser = new TParser(Tokens);
Parser.parse();
}
}
}
还会将This is just a test
打印到控制台。我尝试使用SetText(...)
代替setText(...)
,但这也不起作用,而C# API docs目前处于脱机状态,因此我使用了试用版和错误修正版{{1} }。我用C# 3.1.1 runtime DLL's测试了它。