我正在为IMAP协议编写一个lexer用于教育目的,我很难在lexer和parser之间绘制线.以IMAP服务器响应为例:
* FLAGS (\Answered \Deleted)
Run Code Online (Sandbox Code Playgroud)
此响应在正式语法中定义如下:
mailbox-data = "FLAGS" SP flag-list
flag-list = "(" [flag *(SP flag)] ")"
flag = "\Answered" / "\Deleted"
Run Code Online (Sandbox Code Playgroud)
由于它们被指定为字符串文字(也称为"终端"标记),因此词法分析器为每个标记发出唯一标记更为正确,例如:
(TknAnsweredFlag)
(TknSpace)
(TknDeletedFlag)
Run Code Online (Sandbox Code Playgroud)
或者发出类似这样的东西是否正确:
(TknBackSlash)
(TknString "Answered")
(TknSpace)
(TknBackSlash)
(TknString "Deleted")
Run Code Online (Sandbox Code Playgroud)
我的困惑是前一种方法可能使词法分析器过于复杂 - 如果\Answered在两个不同的上下文中有两个含义,则词法分析器不会发出正确的令牌.作为一个人为的例子(因为电子邮件地址用引号括起来不会出现这种情况),词法分析者如何处理像\ Answered@googlemail.com这样的电子邮件地址?或者,正式语法是否设计为永远不会出现这种歧义?
如何在Oracle PL/SQL类型中定义无参数构造函数?我试过这个:
create or replace type FooBar as object
(
constructor function FooBar() return self as result
);
...
foo_bar := FooBar();
Run Code Online (Sandbox Code Playgroud)
但是类型声明中的空参数列表会引发PLS-00103.