From e1d6802843960e911f19c7e9c4a4b626ae854b90 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 11 Oct 2021 01:42:22 +0200 Subject: feat(web): simplify contextual parsing * More relaxted parsing in the browser for stable variable/node identifier classification. * String support in the browser. * contains, refers, and opposite keywords are no longer contextual, which simplifies parsing in the browser. --- language-web/src/main/js/editor/EditorParent.ts | 3 ++ language-web/src/main/js/editor/problem.grammar | 23 ++++++++++----- .../src/main/js/editor/problemLanguageSupport.ts | 3 +- language-web/src/main/js/index.tsx | 2 +- .../tools/refinery/language/GenerateProblem.mwe2 | 34 +++++++++++++++------- .../java/tools/refinery/language/Problem.xtext | 4 +-- 6 files changed, 48 insertions(+), 21 deletions(-) diff --git a/language-web/src/main/js/editor/EditorParent.ts b/language-web/src/main/js/editor/EditorParent.ts index 316c5072..a2f6c266 100644 --- a/language-web/src/main/js/editor/EditorParent.ts +++ b/language-web/src/main/js/editor/EditorParent.ts @@ -65,6 +65,9 @@ export const EditorParent = styled('div')(({ theme }) => ({ '.cmt-number': { color: '#6188a6', }, + '.cmt-string': { + color: theme.palette.secondary.dark, + }, '.cmt-keyword': { color: theme.palette.primary.main, }, diff --git a/language-web/src/main/js/editor/problem.grammar b/language-web/src/main/js/editor/problem.grammar index 921cec53..cf940698 100644 --- a/language-web/src/main/js/editor/problem.grammar +++ b/language-web/src/main/js/editor/problem.grammar @@ -1,4 +1,3 @@ - @top Problem { statement* } statement { @@ -7,6 +6,7 @@ statement { } | ClassDefinition { ckw<"abstract">? ckw<"class"> RelationName + (ckw<"extends"> sep<",", RelationName>)? (ClassBody { "{" ReferenceDeclaration* "}" } | ".") } | EnumDefinition { @@ -21,6 +21,9 @@ statement { ckw<"default">? (NotOp | UnknownOp)? RelationName ParameterList (":" LogicValue)? "." } | + NodeValueAssertion { + UniqueNodeName ":" Constant "." + } | UniqueDeclaration { ckw<"unique"> sep<",", UniqueNodeName> "." } | @@ -30,18 +33,17 @@ statement { } ReferenceDeclaration { - ((kw<"refers"> | kw<"contains">) !times RelationName | !plus RelationName) + (kw<"refers"> | kw<"contains">)? + RelationName RelationName ( "[" Multiplicity? "]" )? (kw<"opposite"> RelationName)? ";"? } -@precedence { times @left, plus } - Parameter { RelationName? VariableName } -Conjunction { sep1<",", Literal> } +Conjunction { ("," | Literal)+ } OrOp { ";" } @@ -49,9 +51,11 @@ Literal { NotOp? Atom } Atom { RelationName ParameterList? } -Argument { VariableName | Real } +Argument { VariableName | Constant } -AssertionArgument { NodeName | StarArgument | Real } +AssertionArgument { NodeName | StarArgument | Constant } + +Constant { Real | String } LogicValue { ckw<"true"> | ckw<"false"> | ckw<"unknown"> | ckw<"error"> @@ -108,6 +112,11 @@ sep1 { content (separator content?)* } exponential { int ("e" | "E") ("+" | "-")? int } + String { + "'" (![\\'\n] | "\\" ![\n] | "\\\n")+ "'" | + "\"" (![\\"\n] | "\\" (![\n] | "\n"))* "\"" + } + NotOp { "!" } UnknownOp { "?" } diff --git a/language-web/src/main/js/editor/problemLanguageSupport.ts b/language-web/src/main/js/editor/problemLanguageSupport.ts index 2bf7c7a4..c9e61b31 100644 --- a/language-web/src/main/js/editor/problemLanguageSupport.ts +++ b/language-web/src/main/js/editor/problemLanguageSupport.ts @@ -26,7 +26,7 @@ const parserWithMetadata = (parser as LRParser).configure({ LineComment: t.lineComment, BlockComment: t.blockComment, 'problem class enum pred unique scope': t.definitionKeyword, - 'abstract refers contains opposite error default': t.modifier, + 'abstract extends refers contains opposite error default': t.modifier, 'true false unknown error': t.keyword, NotOp: t.keyword, UnknownOp: t.keyword, @@ -34,6 +34,7 @@ const parserWithMetadata = (parser as LRParser).configure({ StarArgument: t.keyword, 'IntMult StarMult Real': t.number, StarMult: t.number, + String: t.string, 'RelationName/QualifiedName': t.typeName, 'UniqueNodeName/QualifiedName': t.atom, 'VariableName/QualifiedName': t.variableName, diff --git a/language-web/src/main/js/index.tsx b/language-web/src/main/js/index.tsx index 1b24eadb..9316db4d 100644 --- a/language-web/src/main/js/index.tsx +++ b/language-web/src/main/js/index.tsx @@ -26,7 +26,7 @@ enum TaxStatus { % A child cannot have any dependents. error invalidTaxStatus(Person p) <-> taxStatus(p, child), - children(p, _q) + children(p, _q), ; taxStatus(p, retired), parent(p, q), !taxStatus(q, retired). diff --git a/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 b/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 index 79eb79a7..58620d6a 100644 --- a/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 +++ b/language/src/main/java/tools/refinery/language/GenerateProblem.mwe2 @@ -3,35 +3,39 @@ module tools.refinery.language.GenerateProblem import org.eclipse.xtext.xtext.generator.* import org.eclipse.xtext.xtext.generator.model.project.* -var rootPath = ".." +var rootPath = '..' Workflow { component = XtextGenerator { configuration = { project = StandardProjectConfig { - baseName = "language" + baseName = 'language' rootPath = rootPath runtimeTest = { enabled = true srcGen = 'src/testFixtures/xtext-gen' } genericIde = { - name = "language-ide" + name = 'language-ide' + } + web = { + enabled = true + name = 'language-web' } mavenLayout = true } code = { - encoding = "UTF-8" - lineDelimiter = "\n" - fileHeader = "/*\n * generated by Xtext \${version}\n */" + encoding = 'UTF-8' + lineDelimiter = '\n' + fileHeader = '/*\n * generated by Xtext \${version}\n */' preferXtendStubs = false } } language = StandardLanguage { - name = "tools.refinery.language.Problem" - fileExtensions = "problem" - referencedResource = "platform:/resource/refinery-language-model/model/problem.genmodel" + name = 'tools.refinery.language.Problem' + fileExtensions = 'problem' + referencedResource = 'platform:/resource/refinery-language-model/model/problem.genmodel' serializer = { generateStub = false } @@ -44,7 +48,17 @@ Workflow { junitSupport = { generateStub = false skipXbaseTestingPackage = true - junitVersion = "5" + junitVersion = '5' + } + webSupport = { + // We only generate the {@code AbstractProblemWebModule}, + // because we write our own integration code for CodeMirror 6. + framework = 'codemirror' + generateHtmlExample = false + generateJettyLauncher = false + generateJsHighlighting = false + generateServlet = false + generateWebXml = false } } } diff --git a/language/src/main/java/tools/refinery/language/Problem.xtext b/language/src/main/java/tools/refinery/language/Problem.xtext index c4c890e3..6f6a8588 100644 --- a/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/language/src/main/java/tools/refinery/language/Problem.xtext @@ -26,7 +26,7 @@ EnumLiteral returns Node: name=Identifier; ReferenceDeclaration: - (-> (containment?="contains" | "refers"))? + (containment?="contains" | "refers")? referenceType=[Relation|QualifiedName] ("[" multiplicity=Multiplicity "]")? name=Identifier @@ -184,7 +184,7 @@ QualifiedName hidden(): Identifier: ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | "scope" | - "unique" | "default" | "problem" | "contains" | "refers" | "new" | "delete"; + "unique" | "default" | "problem" | "new" | "delete"; Integer returns ecore::EInt hidden(): "-"? INT; -- cgit v1.2.3-54-g00ecf