根据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');
这里,就是我有一个java测试类
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'每次正确匹配时会创建一个令牌。 “FRAGMENT RULES”不创建令牌。永远。他们被用作写更好的Lexer规则的糖。他们不属于解析器规则。 'PARSER RULES'用于按照特定的顺序(“语法”)对TOKENS进行分组,但是它们会解析为“FLAT”令牌列表。没有亲子关系。 'REWRITE RULES'用于将解析器规则塑造为TREE(“父母>孩子,孩子......”),以便于解释。 – Kivin 2010-02-28 05:44:33
最后,如果您不了解我写的任何内容,欢迎您给我发电子邮件(kivin [at] kivin/dot \ ca)或IM me(aim kivinkujata)。 – Kivin 2010-02-28 05:46:58
在你的java测试类中,用 parser.pronoun();改变行。 至 parser.sentence(); 你应该打印所有单词,并在代词后打印“s#”文字。我没有做任何格式化,所以请随时为它添加代码(在单独的行上打印每个单词)。 祝你好运。 – WayneH 2010-03-06 19:08:40