【发布时间】:2010-03-17 12:30:37
【问题描述】:
我正在为生产环境构建一个自定义表达式解析器和评估器,以向用户提供有限的 DSL。解析器本身作为 DSL,需要简单。解析器将使用一种不支持动态表达式解析的外来语言构建,也没有任何可用的解析器生成器工具。
我目前的决定是采用 LL(1) 语法的递归下降方法,这样即使以前没有评估表达式经验的程序员也可以快速了解代码的工作原理。
它必须处理由多种数据类型组成的混合表达式:小数、百分比、字符串和日期。而且dd/mm/yyyy格式的日期很容易和一串除法操作混淆。
哪里有解决这个问题的好办法?
我自己的解决方案旨在使解析器保持简单,并在日期前加上一个特殊符号,比如说撇号:
<date> ::= <apostr><digit><digit>/<digit><digit>/<digit><digit><digit><digit>
<apostr> ::= '
<digit> ::= '0'..'9'
【问题讨论】:
-
这取决于你想做什么更多,留下不常见项目的前缀,例如如果日期更常见使用 =1/2/2010 来表示除法。
标签: parsing grammar dsl expressionengine recursive-descent