微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Pidgin 中使用回溯来解析一个包罗万象的输入

如何解决在 Pidgin 中使用回溯来解析一个包罗万象的输入

我开始学习 Pidgin 并且正在尝试编写一个简单的 sql 表达式解析器。我从一些基础知识开始:

var pIdentifier = Tok(Letter.Then(LetterOrDigit.ManyString(),(h,t) => h + t)); // eg,"foo123"
var pIdentifiers = pIdentifier                          // eg,"foo123,bar456"
        .Separated(Char(',').Between(Skipwhitespaces))
        .Before(Skipwhitespaces)
        .Select(cols => cols.ToList());

var pSelect = String("SELECT").Before(Skipwhitespaces); // "SELECT\s*"
var pFrom = String("FROM").Before(Skipwhitespaces);     // "FROM\s*"
var pSemi = Char(';');

然后我将它们全部与 Map

var psql = Map(
    (_select,cols,_from,table,_semi) => (cols,table),pSelect,pIdentifiers,pFrom,pTable,pSemi);

var parsed = psql.Parse("SELECT foo,bar FROM mytable;");
Debug.Assert(parsed.Value.cols[0] == "foo");
Debug.Assert(parsed.Value.cols[1] == "bar");
Debug.Assert(parsed.Value.table == "mytable");

这按预期工作,但我希望在列中允许更多自由格式的输入——而不是标识符,我希望能够处理 SELECT 和 { {1}} 转换为单个字符串。

我能够让它工作的唯一方法是使用FROM

Any.Until(parser)

似乎这种方法将要求任何此类模式与其后的内容相关联。执行此操作的干净/可接受的方法是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。