我想为一种简单的语言定义一个语法。
该语言允许某种类型的分配。
例子
keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
问题是,在关键字和':'
any char 之后应该是可能的(关键字也是)
我已经尝试了很多东西,但我认为我仍然不喜欢词法分析器和解析器的思考......
我的最后一个想法失败了:
rule
: 'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF
;
anychar
: .
;
NEWLINE
: ('\r'? '\n') {$channel=HIDDEN;}
;
编辑
首先:感谢您的回答!
我通读了手册并查看了 scott stanchfield 的教程。
问题是,我没有得到“anychar”的东西!
你是对的,我上面写的语法是错误的,因为我很着急。
这是一个更好的尝试。问题仍然是,Tokenizer 在定义 ala 中识别例如关键字
keyworda : this is keyworda.
keywordb : this is another key!
...
语法:
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;};
编辑二
哦,我的上帝,按照你解释的方式做这件事很明显。不知道为什么我自己没有得到它!非常感谢蒂姆的解释!
我还有一个问题:如果我为词法分析器定义我的标记,为解析器定义我的语法。它是在树解析器还是在解析器本身中检查语义的常用方法?
例如,假设我定义了与您发布的相同的语法。
keyworda : ab
keywordb : xy
keyworda : ab1
keywordb : xy1
...
现在我想检查在每个关键字a 定义之后是否定义了关键字b。稍后我确实想检查该值是否正确的含义。假设我们确实有一个关键字extends:'keyword value',我需要检查'keyword value'是否已经定义。
我可以通过两种方式做到这一点:首先,更改解析器的语法规则并在此处添加用于检查的 java 代码。其次,语法保持原样,我定义了一个树解析器语法来检查这些条件。
我真的不知道哪种方式更好,有什么优点或缺点......
非常感谢你的帮助