Closed NicolasRouquette closed 6 years ago
Roughly, this is enough to reproduce this:
def void test() {
val rs = resourceSetProvider.get
val r = rs.createResource(URI.createFileURI("file:OMLAnnoationTest3.oml"))
val Extent e = commonF.createExtent()
r.getContents.add(e)
val TerminologyGraph g = graphsF.createTerminologyGraph()
e.getModules.add(g)
g.setIri("http://www.example.org/OMLAnnotationTest3")
val AnnotationProperty ap1 = commonF.createAnnotationProperty
ap1.module = g
ap1.abbrevIRI = "test:doc1"
ap1.iri = "http://www.example.org/OMLAnnotationTest3#doc1"
addAnnotation(g, ap1, '''Latch Valve: LP - 3/8''')
val ByteArrayOutputStream bos = new ByteArrayOutputStream()
val Builder builder = SaveOptions.newBuilder()
builder.format()
val SaveOptions s = builder.getOptions();
r.save(bos, s.toOptionsMap());
}
def void addAnnotation(LogicalElement e, AnnotationProperty ap, String v) {
val AnnotationPropertyValue av = commonF.createAnnotationPropertyValue
e.annotations += av
av.property = ap
val s = commonF.createLiteralQuotedString()
s.string = new QuotedStringValue(v)
av.value = s
}
This turns out to be a limitation of the Xtext 2.12 grammar where the rule for raw strings is non-greedy. For technical details, see: https://www.eclipse.org/forums/index.php/m/1781919/#msg_1781919
Christian Dietrich suggests switching to a custom lexer: https://www.eclipse.org/forums/index.php?t=msg&th=1091720&goto=1781921&#msg_1781921
He wrote a blog article about this: https://typefox.io/taming-the-lexer
And provided some concrete suggestions how to do this: https://www.eclipse.org/forums/index.php?t=msg&th=1091720&goto=1781926&#msg_1781926
A possible short-term hack would be to run the current lexer generator and post-process the generated output to change the mRULE_RAW_STRING_VALUE()
method as described here:
https://www.eclipse.org/forums/index.php?t=msg&th=1091720&goto=1781919&#msg_1781919
Another option is to follow Christian's blog article and switch from Antlr3 to Antlr4 or JFlex.
Switching to a custom lexer makes sense; however, this Xtext surgery needs to be deferred. For now, this issue can be reasonably resolved with a simple workaround:
In OML, make sure that the last character of an OML RawString
is anything but "
.