使用Antlr实现表达式引擎
2007-04-17 23:42
363 查看
上周末尝试使用Antlr生成C#语言的表达式引擎,目前已经可以支持基本运算.主要思路是把表达式解析成操作数和函数(操作符也作为函数看待)两种类型节点,主要部分类图如下:
GrandExpr.g文件内容如下:
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]
GrandExpr.g文件内容如下:
grammar GrandExpr; options { output=AST; ASTLabelType=CommonTree; // language=CSharp; } tokens { INDEX; MEMBERACCESS; CALL; } expr : logicalOrExpr ; logicalOrExpr : logicalAndExpr (OR logicalAndExpr)* ; logicalAndExpr : equalityExpr (AND equalityExpr)* ; equalityExpr : relationalExpr ((EQUALS|NOTEQUALS)^ relationalExpr)* ; relationalExpr : additiveExpr ((LT|LTEQ|GT|GTEQ)^ additiveExpr)? ; additiveExpr : multiplyExpr ((PLUS|MINUS)^ multiplyExpr)* ; multiplyExpr : powExpr ((a=MUL| a=DIV | a=MOD) powExpr)* ; powExpr : unaryExpr (POWER unaryExpr)? ; unaryExpr : (PLUS | MINUS | NOT) unaryExpr | memberExpr ; memberExpr : basicExpr (memberAccessExpr)* (indexerExpr)? ; basicExpr : parenExpr | literal | memberFunctionExpr; parenExpr : LPAREN! expr RPAREN! ; literal : numbericLiteral | stringLiteral ; numbericLiteral : INTEGER_LITERAL | DECIMAL_LITERAL | DATETIME_LITERAL ; stringLiteral : STRING_LITERAL ; memberAccessExpr : '.' memberFunctionExpr -> ^(MEMBERACCESS memberFunctionExpr) ; memberFunctionExpr : fieldPropertyExpr | methodExpr ; fieldPropertyExpr : IDENTIFIER ; methodExpr : IDENTIFIER LPAREN (argument (COMMA argument)*)? RPAREN -> ^(CALL IDENTIFIER argument*) ; indexerExpr : LBRACKET argument (COMMA argument)* RBRACKET -> ^(INDEX argument+) ; argument : expr ; AND : 'and' ; OR : 'or' ; NOT : 'not' ; COMMA : ',' ; PLUS : '+' ; MINUS : '-' ; MUL : '*' ; DIV : '/' ; MOD : '%' ; POWER : '^' ; EQUALS : '='; NOTEQUALS : '!=' | '<>'; LT : '<'; LTEQ : '<='; GT : '>'; GTEQ : '>='; LPAREN : '(' ; RPAREN : ')' ; LBRACKET : '[' ; RBRACKET : ']' ; DATETIME_LITERAL : '\'' STRING_LITERAL '\'' ; STRING_LITERAL : '"' (~'"')* '"' ; IDENTIFIER : LETTER (LETTER|Digit)* ; fragment LETTER : 'A'..'Z'|'a'..'z'|'_' ; DECIMAL_LITERAL : (INTEGER_LITERAL)? '.' Digit* Exponent? ; fragment Exponent : ('e'|'E') INTEGER_LITERAL ; INTEGER_LITERAL : Digit+ ; fragment Digit : '0'..'9' ; /* Ignore white spaces */ WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;} ;
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]
相关文章推荐
- Antlr实现表达式引擎的语法文件
- 使用aspx页面作为模板引擎的一种实现
- Java中使用正则表达式实现字符串匹配
- 使用Groovy脚本引擎 根据表达式求值 或 反向解析构造对象
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
- 第88讲:Scala中使用For表达式实现map、flatMap、filter
- iphone中使用第三方工具(RegexKitLite)实现正则表达式
- 使用Layabox引擎中正则表达式匹配IP
- 使用Antlr实现简单的DSL
- C#.NET使用TTS引擎实现文语转换
- 使用 Drools 规则引擎实现业务逻辑
- VC中使用ATL库实现正则表达式匹配(ADODB::Error)
- DEELX 1.2正则表达式引擎的使用
- Python中使用正规表达式实现查找和匹配串
- Windows下 使用Python 3 调用讯飞 TTS 引擎实现文本转语音
- Java使用正则表达式对注册页面进行验证功能实现
- iphone中使用第三方工具(RegexKitLite)实现正则表达式
- 实现中缀整数表达式求值--使用数组实现,在数组头处一个栈,在数组尾部有另一个栈
- 使用 Drools 规则引擎实现业务逻辑
- python里使用正则表达式的search()函数实现指定位置搜索