我目前正在尝试在scala中定义时钟数据流语言的模型.
流程实际上代表某种类型T的无限序列值,由某个时钟C调节(时钟表示流量实际可用的时刻).
通过根据从另一个(布尔)流F'导出的时钟C本身对其进行采样,可以从流F导出采样流SF:SF包含当布尔流F'为真时采样的F的值.
"基本时钟"是从名为"T"的始终为真的流派生的时钟.
在下面的示例中,F和F'位于基准时钟上(并且 - 用于表示流在某个时刻没有值)
T : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... (always 1)
F : 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 ...
F' : 0 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 ...
F sampled on F': - 0 - - - 1 - …Run Code Online (Sandbox Code Playgroud) scala path-dependent-type dependent-type type-level-computation shapeless
我正在使用 antlr 4.5 为具有多种特殊注释格式的语言构建解析器,我想将其流式传输到不同的频道。
似乎 antlr 4.5 已经扩展了一个用于声明额外词法分析器通道的新构造:
摘自文档https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules
从 4.5 开始,您还可以在词法分析器规则上方使用以下构造定义像枚举一样的通道名称:
频道 { WSCHANNEL, MYHIDDEN }
我的词法分析和解析规则在一个文件中,我的代码如下所示:
channels {
ANNOT_CHANNEL,
FORMAL_SPEC_CHANNEL,
DOC_CHANNEL,
COMMENT_CHANNEL,
PRAGMAS_CHANNEL
}
Run Code Online (Sandbox Code Playgroud)
... 解析规则 ...
// expression annotation (sent to a special channel)
ANNOT: (EOL_ANNOT | LUS_ANNOT | C_ANNOT) -> channel(ANNOT_CHANNEL) ;
fragment LUS_ANNOT: '(*!' ( COMMENT | . )*? '*)' ;
fragment C_ANNOT: '/*!' ( COMMENT | . )*? '*/' ;
fragment EOL_ANNOT: ('--!' | '//!') .*? EOL ;
// formal specification annotations (sent …Run Code Online (Sandbox Code Playgroud) 在将源 AST1 转换为目标 AST2(在 Scala 中构建 DSL 编译器)时,我试图实现某种多态缓存。因为我希望缓存为翻译结果保留精确的类型,所以我使用了无形的 HMap。它按预期工作,但是在某些时候我需要迭代缓存内容以将其转储到必须记录翻译过程的文件中,然后将用于构建从 A2 到 A1 的回译。通过查看 HMap 的源代码,我看到有一个我无法访问的底层 HashMap[Any, Any],因为它不是 HMap 中的 val,而且我看到 HMap 实际上是一个多态函数值,这意味着我可以将它应用到 HList 上,它的类型对应于 HMap 键类型的子集,但我真正想做的是能够折叠一个多态函数,该函数在此 HMap 上接受多态(键,值)参数,以另一种形式检索其内容(例如,在标准 HashMap 元组中切片)。有没有办法做到这一点?最好的事物。