ANTLR: Как заменить все символы, определенные как пробел, фактическим пробелом - PullRequest
2 голосов
/ 24 декабря 2010

Мой код 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. Есть хорошие уроки?

1 Ответ

3 голосов
/ 24 декабря 2010

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 * Удачи!

...