标签:
The Definitive Antlr 4 Reference 2nd Edition 第4章第一小节 学习笔记
匹配算数表达式语言
本例中,只使用基本的算数运算(加,减,乘,除),括号表达式,整数,及变量。例如有如下的表达式。
193 a = 5 b = 6 a+b*2 (1+2)*3
grammar expr; prog : stat+; stat : expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ; expr: expr ('*' | '/') expr | expr ('+' | '-') expr | INT | ID | '(' expr ')' ; ID : [a-zA-Z]+; INT : [0-9]+; NEWLINE: '\r'?'\n';
此外Antlr v4 的一个重要的特性是能够处理大多数的左递归规则。
文法文件写完后 鼠标右键文法文件 -> Generate Antlr...... 随后会在指定的目录下生成XXparser 与 XXLexer文件。通过这些文件就可以完成分析任务了。
public class Main { public static void main(String[] args) { String expr = "(1+2*3/2-7))"; ANTLRInputStream input = new ANTLRInputStream(expr); exprLexer lexer = new exprLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); exprParser parser = new exprParser(tokens); ParseTree tree = parser.prog(); System.out.println(tree.toStringTree(parser)); } }
导入文法
若将所有内容写在一个文件内,则不便于管理,因此可以将文法文件分解。其中一种办法是将文法与词法分开定义。通过lexer grammar定义词法文件,最后在语法文件中用import关键字将词法定义导入。
定义文法文件,该文件内的词法定义已经移入CommonLexerRules.g4文件中,并通过import导入该文件内容。
expr.g4文件
grammar expr; import CommonLexerRules; prog : stat+; stat : expr NEWLINE | ID '=' expr NEWLINE | NEWLINE ; expr: expr ('*' | '/') expr | expr ('+' | '-') expr | INT | ID | '(' expr ')' ;
CommonLexerRules.g4
lexer grammar CommonLexerRules; ID : [a-zA-Z]+; INT : [0-9]+; NEWLINE: '\r'?'\n'; WS : [\t]+ -> skip;
标签:
原文地址:http://blog.csdn.net/revivedsun/article/details/51357351