EDITED по грамматике WayneH вКак отобразить все местоимения в предложении и их лица с помощью Antlr
Вот что я имею в моем файле грамматики.
grammar pfinder;
options {
language = Java;
}
sentence
: ((words | pronoun) SPACE)* ((words | pronoun) ('.' | '?'))
;
words
: WORDS {System.out.println($text);};
pronoun returns [String value]
: sfirst {$value = $sfirst.value; System.out.println($sfirst.text + '(' + $sfirst.value + ')');}
| ssecond {$value = $ssecond.value; System.out.println($ssecond.text + '(' + $ssecond.value + ')');}
| sthird {$value = $sthird.value; System.out.println($sthird.text + '(' + $sthird.value + ')');}
| pfirst {$value = $pfirst.value; System.out.println($pfirst.text + '(' + $pfirst.value + ')');}
| psecond {$value = $psecond.value; System.out.println($psecond.text + '(' + $psecond.value + ')');}
| pthird{$value = $pthird.value; System.out.println($pthird.text + '(' + $pthird.value + ')');};
sfirst returns [String value] : ('i' | 'me' | 'my' | 'mine') {$value = "s1";};
ssecond returns [String value] : ('you' | 'your'| 'yours'| 'yourself') {$value = "s2";};
sthird returns [String value] : ('he' | 'she' | 'it' | 'his' | 'hers' | 'its' | 'him' | 'her' | 'himself' | 'herself') {$value = "s3";};
pfirst returns [String value] : ('we' | 'us' | 'our' | 'ours') {$value = "p1";};
psecond returns [String value] : ('yourselves') {$value = "p2";};
pthird returns [String value] : ('they'| 'them'| 'their'| 'theirs' | 'themselves') {$value = "p3";};
WORDS : LETTER*;// {$channel=HIDDEN;};
SPACE : (' ')?;
fragment LETTER : ('a'..'z' | 'A'..'Z');
и вот, с того, что я есть на тестовом ява класса
import java.util.Scanner;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import java.util.List;
public class test2 {
public static void main(String[] args) throws RecognitionException {
String s;
Scanner input = new Scanner(System.in);
System.out.println("Eter a Sentence: ");
s=input.nextLine().toLowerCase();
ANTLRStringStream in = new ANTLRStringStream(s);
pfinderLexer lexer = new pfinderLexer(in);
TokenStream tokenStream = new CommonTokenStream(lexer);
pfinderParser parser = new pfinderParser(tokenStream);
parser.pronoun();
}
}
что мне нужно поставить в тестовый файл, так что он будет отображать все местоимения в предложении и их соответствующие значения (s1, s2, ...)?
В заключение этой проблемы я оставлю вас с несколькими мыслями, чтобы помнить. «LEXER RULES» создают маркер каждый раз, когда они правильно соответствуют. «ПРАВИЛА ФРАГМЕНТОВ» не создают токенов. Когда-либо. Они используются в качестве сахара для написания более приятных правил Lexer. Они не принадлежат к Правилам Парсера. «ПАРСИОННЫЕ ПРАВИЛА» используются для GROUP TOKENS в определенном порядке («синтаксис»), однако они разрешаются в списке «ЛЕНТА» маркеров. Там нет отношений между родителями и детьми. «REWRITE RULES» используются для формирования правил Parser в TREE («parent> child, child, ...») для удобства INTERPRETING. – Kivin
И, наконец, вы вполне можете направить меня по электронной почте (kivin [at] kivin/dot \ ca) или IM me (aim kivinkujata), если вы не понимаете ничего, что я написал. – Kivin
В вашем тестовом классе java измените строку на parser.pronoun(); - parser.sentence(); И вы должны напечатать все слова и напечатать текст «s #» после ваших местоимений. Я не делал никакого форматирования, поэтому не стесняйтесь добавлять код для этого (напечатайте каждое слово в отдельной строке). Удачи. – WayneH