Java
Вызовите метод лексера setText(...)
:
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 является книга: Полное руководство по ANTLR: создание доменных языков .
C #
Для цели 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 в настоящее время отключены, поэтому я использовал метод проб и ошибок {Text = " ";}
.Я проверил это с помощью .
DLL-библиотеки времени выполнения *1047* C # 3.1.1 * Удачи!