Ale*_*der 4 antlr keyword antlrv3ide
我想为一种简单的语言定义语法.
该语言允许某种分配.
例
keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
Run Code Online (Sandbox Code Playgroud)
问题是,在关键字和':'任何char之后应该是可能的(关键字也是)
我尝试过很多东西,但我认为我仍然没有进入词法分析器和解析器思考...
我最后的想法失败了:
rule
: 'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF
;
anychar
: .
;
NEWLINE
: ('\r'? '\n') {$channel=HIDDEN;}
;
Run Code Online (Sandbox Code Playgroud)
首先:谢谢你的回答!
我通读了手册并查看了scott stanchfield的教程.
问题是,我没有得到"anychar"的东西!
你是对的,我上面提到的语法错了,因为我很着急.
这是一个更好的尝试.问题仍然是,Tokenizer在定义ala中识别例如keyworda
keyworda : this is keyworda.
keywordb : this is another key!
...
Run Code Online (Sandbox Code Playgroud)
语法:
rule
: KEYA ':' STRING_LITERAL* NEWLINE
keybdefinition*
EOF
;
keybdefinition
: KEYB ':' STRING_LITERAL* NEWLINE
;
KEYA: 'keyworda';
KEYB:'keywordb';
STRING_LITERAL: 'a'..'z' | 'A'..'Z' | '0'..'9' | ':' | '.' | '&' | '/' | '\\' | ';';
NEWLINE: '\r'? | '\n';
SPACE: (' ' | '\t') {$channel=HIDDEN;};
Run Code Online (Sandbox Code Playgroud)
噢,天哪,你解释它的方式很明显.不知道为什么我自己没有得到它!非常感谢蒂姆的解释!
我还剩下一个问题:如果我为词法分析器定义我的标记,为解析器定义我的语法.它是检查树解析器或解析器本身中语义的常用方法吗?
例如,假设我有与您发布的语法相同的语法.
keyworda : ab
keywordb : xy
keyworda : ab1
keywordb : xy1
...
Run Code Online (Sandbox Code Playgroud)
现在我想检查每个关键字定义后是否定义了关键字b.后来我确实想检查一下这个值是否正确.让我们假设我们有一个关键字extends:'keyword value',我需要检查是否已定义'keyword value'.
我可以通过两种方式实现这一点:首先,更改解析器的语法规则,并在那里添加用于检查的java代码.其次,语法保持不变,我定义了一个树解析器语法来检查这些条件.
我真的不知道哪个方式更好,哪个方面有优点或缺点......
非常感谢你的帮助
Bar*_*ers 16
该.内部有lexer-和分析器规则具有不同的含义.内部词法规则,它与从范围内的任意字符\u000... \uFFFF.在解析器规则中,.匹配任何令牌.
请注意,词法分析器规则以大写字母开头,而解析器规则以小写字母开头.您还可以在解析器规则中创建标记(词法分析器规则)作为文字.这意味着你的语法只会创建4个不同的标记(真的是3,因为它NEWLINE是"隐藏的"):
'keyworda' ':' 'keywordb'NEWLINE (从默认令牌流中删除)(EOF是内置令牌)
因此,这会使您的anychar规则匹配'keyworda',':'或者'keywordb',而不是您可能期望的任何字符.
此外,您似乎是key ':' value通过换行符分隔您的-entries,但是您在lexing-phase期间删除了换行符.通过删除它们,你怎么知道a的结尾value是什么,a的开始key是什么?你的令牌流将是一个连续的关键字流,任何字符和冒号,所以没有办法告诉关键字真的是关键字,还是其中的一部分value(右边':').你需要一个换行令牌.
看起来你已经开始使用ANTLR而不知道你在做什么:IMO,这不是学习这个特定工具的方法.我建议在继续之前获取一份The Definitive ANTLR Reference或阅读/查看一些ANTLR教程.
祝你好运!
以下是如何让关键字也成为"价值"的一部分的快速演示:
grammar T;
parse
: line+ EOF
;
line
: key COLON value eol
{System.out.printf("key='\%s', value='\%s'\n", $key.text, $value.text);}
;
value
: any_except_newline*
;
key
: KEYA
| KEYB
;
any_except_newline
: COLON
| KEYA
| KEYB
| WORD
| ANYCHAR
;
eol
: NEWLINE
| EOF
;
COLON : ':';
KEYA : 'keyworda';
KEYB : 'keywordb';
WORD : ('a'..'z' | 'A'..'Z')+;
NEWLINE : '\r'? '\n' | '\r';
SPACE : (' ' | '\t') {$channel=HIDDEN;};
ANYCHAR : .;
Run Code Online (Sandbox Code Playgroud)
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
String source =
"keyworda : this is keyworda.\n" +
"keywordb : this is another key!";
TLexer lexer = new TLexer(new ANTLRStringStream(source));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您现在运行演示:
java -cp antlr-3.3.jar org.antlr.Tool T.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main
Run Code Online (Sandbox Code Playgroud)
你会看到跟随被打印到控制台:
key='keyworda', value='this is keyworda.'
key='keywordb', value='this is another key!'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9988 次 |
| 最近记录: |