如何解决在 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 举报,一经查实,本站将立刻删除。