- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Isabelle 的漩涡图案中实现一种领域特定语言(带有自己的解析器)。例如,我希望术语 (MY ‹123›, 3)
为子字符串 123
调用我自己的解析器,但将其余部分正常解析为术语。
在 HOL/ex/Cartouche_Examples.thy
之后,我了解了如何为 MY ‹...›
形式的子项安装我自己的解析翻译,以及如何以 string*Position.T
或 Symbol_Pos.T list
的形式获取漩涡花饰的内容。
我还了解如何使用 Isabelle 的解析器组合器编写类型为 term parser
的解析器。
但我找不到如何将解析器应用于字符串(或 Symbol_Pos.T 列表
)。
换句话说,我还缺少一个功能
fun parse_cartouche ctx (cartouche:string) (pos:Position.T) : term = ???
将我的 term parser
类型的解析器应用于字符串 cartouche
(并正确地向顶层报告解析错误)。
澄清:
我想利用 Isabelle 的现有基础架构来跟踪/报告解析位置。例如,如果存在解析错误,我希望代码在 Isabelle/jEdit 中显示为红色,如果在我自己的语言中,我会调用像 Args.parse_term 这样的解析器,我希望 Isabelle/jEdit 颜色变量正确,并通过控制悬停获取类型信息。
我不想为 int 等常见事物重新实现自己的解析器,但如果我至少了解了上一个要点,则可以这样做。 (但是,将我的语言的子字符串解析为术语时,我将不得不使用一些现有的解析函数,因为我无法自行重新实现 Isabelle 语法。
下面是我到目前为止的完整代码(带有 parse_cartouche
的虚拟实现)。
theory Scratch
imports Main
begin
ML {*
(* In reality, this would of course be a much more complex parser. *)
val my_parser : term parser = Parse.nat >> HOLogic.mk_nat
(* This function should invoke my_parser to parse the content of cartouche.
Parse errors should be properly reported (i.e., with red highlighting in
jEdit etc. *)
fun parse_cartouche ctx (cartouche:string) (pos:Position.T) : term =
(warning ("I should parse: " ^ cartouche ^ ". Returning arbitrary term instead"); @{term True})
(* Modified from Cartouche_Examples.thy *)
fun cartouche_tr (ctx:Proof.context) args =
let fun err () = raise TERM ("cartouche_tr", args) in
(case args of
[(c as Const (@{syntax_const "_constrain"}, _)) $ Free (s, _) $ p] =>
(case Term_Position.decode_position p of
SOME (pos, _) => c $ (parse_cartouche ctx s pos) $ p
| NONE => err ())
| _ => err ())
end;
*}
syntax "_my_syntax" :: "cartouche_position ⇒ 'a" ("MY_")
parse_translation ‹[(@{syntax_const "_my_syntax"}, cartouche_tr)]›
term "(MY ‹123›, 3)" (* Should parse as (123,3) *)
end
最佳答案
因为这是一个相对罕见的用例,我不确定是否已经出现了“规范”的解决方案。但我至少可以从我自己的代码中给你两个例子,这应该有助于说明一般方法。
下面的解析翻译,给定一个函数 eval_term : string -> term
,从一个漩涡花饰中提取一些 ML 源,将它评估为一个 term
,然后使用它作为解析翻译的结果。
fun term_translation ctxt args =
let
fun err () = raise TERM ("Splice.term_translation", args)
fun input s pos =
let
val content = Symbol_Pos.cartouche_content (Symbol_Pos.explode (s, pos))
val (text, range) = Symbol_Pos.implode_range (Symbol_Pos.range content) content
in
Input.source true text range
end
in
case args of
[(c as Const (@{syntax_const "_constrain"}, _)) $ Free (s, _) $ p] =>
(case Term_Position.decode_position p of
SOME (pos, _) => c $ eval_term (input s pos) ctxt $ p
| NONE => err ())
| _ => err ()
end
这个允许我将 XML 文字嵌入到术语中,然后将其解释为术语。
syntax "_cartouche_xml" :: "cartouche_position \<Rightarrow> 'a" ("XML _")
parse_translation\<open>
let
fun translation args =
let
fun err () = raise TERM ("Common._cartouche_xml", args)
fun input s pos = Symbol_Pos.implode (Symbol_Pos.cartouche_content (Symbol_Pos.explode (s, pos)))
val eval = Codec.the_decode Codec.term o XML.parse
in
case args of
[(c as Const (@{syntax_const "_constrain"}, _)) $ Free (s, _) $ p] =>
(case Term_Position.decode_position p of
SOME (pos, _) => c $ eval (input s pos) $ p
| NONE => err ())
| _ => err ()
end
in
[(@{syntax_const "_cartouche_xml"}, K translation)]
end
\<close>
以下代码应允许您将 Input.source
转换为解析器组合器可消化的内容,包括完整的位置信息:
ML ‹
val input = ‹term"3 + 4"›;
(* a bit more complicated than just Input.pos_of because otherwise the position includes the
outer cartouche brackets, which manifests as an off-by-one-error in the markup *)
val pos = Input.source_explode input |> Symbol_Pos.range |> Position.range_position;
val str = Input.source_content input;
val toks = Token.explode Keyword.empty_keywords pos str;
val parser = Args.$$$ "term" |-- Args.embedded_inner_syntax;
parser toks |> fst |> Syntax.read_term @{context}
›
关于isabelle - 使用 "term parser"解析漩涡花饰的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593468/
我遇到了随机森林抛出错误的问题。 我有这个数据框,其中包含已经采用矩阵形式的推文数据,其中包含我试图预测的情绪列。 'data.frame': 1000 obs. of 2155 variabl
在 ansi-term 和 multi-term 中,在我 cd 到一个目录后,我收到一条错误消息和乱码输出,其中 ls 的内容打印但与提示重叠。这是我得到的 $ cd /Users/crippled
我是否必须设置诸如.emacs.d/init_bash.sh之类的东西(对于shell模式),或者它可以读取我的~/.bash_profile直接地?如果是后者,如何设置配置 ansi-term/mu
我有一个类似这样的查询 select city_desc from mst_city where upper(city_desc) like upper('%branch%') 它填充结果以分支开头的
在这里,我试图获取多个术语的搜索结果。说 fulltext="Lee jeans",然后 regexresult={"lee","jeans"}。 代码: IProviderSearchContext
我有一个看起来像这样的方法: public void UpdateTermInfo(List termInfoList) { foreach (Term termInf
With your perfect help here我已经了解了如何计算热门话题(标准分数 + float 平均值)。 我的下一个问题:我的数据库中的术语(由 1-3 个单词组成)与它们被提及的时间
我需要有目的地再创建 2 个表:一个表将存储标签和类别数据(类别可以有层次结构,但标签没有),另一个表存储标签、类别和内容之间的关系。但我对那两张 table 的名称很困惑。我确实是网络开发的新手。经
我在 Elasticsearch 文档 (6.8) 中看到了关于跨度查询的部分, 请求和结果类似于一些术语级别的查询,但它提到跨度是“低级别位置”,闻起来更像是偏好(也许我错了)。 问题是如果我想使用
我在使用 Solr 4.2.0 的“/terms”请求处理程序方面遇到困难。 使用 Web 浏览器,以下 url 返回 fieldName INDUSTRY 的术语列表 http://localhos
我目前正尝试在 elasticsearch 中做一些有趣的事情……而且它几乎可以工作。 用例:我必须将每个特定字段的结果数限制为 (x) 个结果。 示例:在餐厅的结果集中,我只想为每个餐厅名称返回两个
在 term.el ,我们可以从一种子模式更改为另一种子模式。但是,有没有办法用一个功能(和一个键绑定(bind))在它们之间切换? 另一个问题:有没有办法在term-char-mode 中用键盘标记
我有一个按以下顺序列出的员工姓名和薪水列表 我需要按以下格式创建输出表。即,每当累计工资总额超过 3000 时,我必须检测到并标记该行。 我试图做 row_cumsum 并在它超过 3000 时重置
当使用 eshell 或 ansi-term 和 bash emacs 时,会根据您所在的目录更改默认目录变量。 因此,如果我移动到 /home/user/code/project,然后使用 ido-
我可以在我的数据集上使用 R 包“e1071”运行 svm,但我无法使用任何两个预测变量绘制图形。即使谷歌搜索了很多,我也无法找到它的解决方案。请高手帮我解决这个问题: 我有一个具有以下属性的数据集:
Term::ReadLine::Stub::new(/usr/lib/perl5/5.8.8/Term/ReadLine.pm:243): 我期待看到Term::ReadLine::new ,这通常是
我要搜索这个: Post Cereal 得到这个: Post Honey Nut Cereal 通配符是空格。 我知道我可以执行 SPLIT 和一系列 AND 和 Contains() 并将每个术语作
我想根据聚合数据在换句话说过滤数据中放置一个条件。 目前,我有一个查询 GET sense/_search { "size": 0, "aggs": { "dates": {
我在一个围绕化学式的项目上遇到了麻烦。我有两个类(class),Term 和 Formula。 Term 接收诸如“H”或“C2”之类的输入 - 只有一个字母和任意数量的后续数字。它的字段是 elem
我尝试使用 boost::numerics::odeint 来积分微分方程组。我的代码是 dMat Equation::solveODE(dMat u_i, double t_i) { dVec u_
我是一名优秀的程序员,十分优秀!