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")
。
那么,如何轻松地在两种方案之间进行转换?我想保留所有信息,例如突出显示的部分。
干杯。
答案 0 :(得分:1)
这里有两个不同之处。
java+method
是一个逻辑位置,project
是一个物理位置。我认为描述其差异的最佳方式是物理位置描述实际文件的位置或实际文件的子集。逻辑位置描述特定实体在较大模型的上下文中的位置。例如,java类/项目中的java方法。逻辑位置通常可以映射到物理位置,但并非总是如此。
例如,对于m3,您可以使用resolveLocation
中的IO
来获取逻辑位置指向的文件中的实际偏移量。
并非所有地点都可写,我不认为任何逻辑位置。但也有物理位置是只读的。从这个意义上说,你得到的错误是通用的。
Rascal确实支持在文本文件中间书写,很可能你不想使用appendToFile
,因为它会在你指向它的位置之后追加。您很可能希望用新部分替换文本的一部分,因此常规writeFile
应该有效。
请注意,每次写入后都必须重新计算文件中的所有偏移量。因此,逻辑位置的已解析物理位置将过时,因为自从构建m3模型及其在逻辑位置和物理位置之间的相应映射后文件已更改。
因此,对于此用例,您可能想要考虑更好的方法。最好的解决方案是使用语法,并重写文件的解析树,并在重写后覆盖旧文件。请注意,Rascal附带的最新Java语法适用于Java 5,因此这可能比您希望的工作多一些。也许将您的目标定位为新 Stack Overflow问题,我们会看到其他选项可能适用。