在M3`loc`方案和常规`loc`类型之间转换?

时间:2018-01-19 18:04:22

标签: rascal

M3 Core模块在Rascal中返回一种简化的loc表示。例如,文件MapParser中的方法可能包含loc|java+method:///MapParser/a()|

然而,这显然与我倾向于看到的其他loc方案不同,后者或多或少看起来像|project://main-scheme/src/tests/MapParser.java|

除了某些功能只接受一种或另一种方案外,这不会有问题。例如,函数appendToFile(loc file, value V...)不接受M3使用的此方案,并将拒绝它,例如:IO("Unsupported scheme java+method")

那么,如何轻松地在两种方案之间进行转换?我想保留所有信息,例如突出显示的部分。

干杯。

1 个答案:

答案 0 :(得分:1)

这里有两个不同之处。

物理与逻辑位置

java+method是一个逻辑位置,project是一个物理位置。我认为描述其差异的最佳方式是物理位置描述实际文件的位置或实际文件的子集。逻辑位置描述特定实体在较大模型的上下文中的位置。例如,java类/项目中的java方法。逻辑位置通常可以映射到物理位置,但并非总是如此。

例如,对于m3,您可以使用resolveLocation中的IO来获取逻辑位置指向的文件中的实际偏移量。

只读与可写位置

并非所有地点都可写,我不认为任何逻辑位置。但也有物理位置是只读的。从这个意义上说,你得到的错误是通用的。

Rascal确实支持在文本文件中间书写,很可能你不想使用appendToFile,因为它会在你指向它的位置之后追加。您很可能希望用新部分替换文本的一部分,因此常规writeFile应该有效。

一些注释

请注意,每次写入后都必须重新计算文件中的所有偏移量。因此,逻辑位置的已解析物理位置将过时,因为自从构建m3模型及其在逻辑位置和物理位置之间的相应映射后文件已更改。

因此,对于此用例,您可能想要考虑更好的方法。最好的解决方案是使用语法,并重写文件的解析树,并在重写后覆盖旧文件。请注意,Rascal附带的最新Java语法适用于Java 5,因此这可能比您希望的工作多一些。也许将您的目标定位为 Stack Overflow问题,我们会看到其他选项可能适用。