工作中经常会用到oracle中的ora文件,比如tnsnames.ora等,看的多了,就像整理出ora的BNF定义。以前整理过一些BNF,用lex/yacc或者javacc可以很快的做出一个简单的解释器,所以对这些东西很感兴趣。好了,我们来看看ora的BNF吧:
config : ( parameter )*;
parameter : keyword EQ
( value
| '(' value_list ')'
| ( '(' parameter ')' )+
);
keyword : WORD;
value : WORD | QSTRING;
value_list : value ( COMMA value )*;
QSTRING : \' [~\']* \'
| \" [~\"]* \";
WORD : [a-zA-Z0-9];
COMMENT : '#' [~\n]*;
WHITESPACE : [\t ]+;
当然,这个只是简单的BNF,做成解释器还需要加入相应的动作解释。
仔细看了看自己的blog,发现之前也整理过类似的定义,比如:Lisp的BNF,还有dot语言的BNF。只有dot的做了一部分,Lisp的根本没有做,需要抽时间专门做一下,不然自己的手也生了。其实,如果掌握了正则表达式和上下文无关文法这两个部分,借助lex/yacc,javacc/anltr等工具很容易做出来,不过时间长了又忘了。
本文探讨了Oracle中ORA文件的BNF定义,并提供了一个简单的语法定义示例。作者曾尝试使用lex/yacc和javacc等工具实现简单解释器。
3082

被折叠的 条评论
为什么被折叠?



