Skip to content
Snippets Groups Projects
Commit f1753486 authored by Janis Daniel Dähne's avatar Janis Daniel Dähne
Browse files

- added syntax diagram

parent 97684a5d
Branches
No related tags found
No related merge requests found
......@@ -224,6 +224,11 @@ statement
;
fullQualifiedName
: IDENT
| IDENT DOUBLE_COLON fullQualifiedName
;
/* --- relations --- */
/*
X -- Y
......@@ -656,10 +661,3 @@ someLine
| GENERALIZATION_2_LINE_RIGHT_SIMPLE
| GENERALIZATION_2_LINE_RIGHT_DOTTED_SIMPLE
;
fullQualifiedName
: IDENT
| IDENT DOUBLE_COLON fullQualifiedName
;
\ No newline at end of file
......@@ -3,13 +3,9 @@
"version": "0.0.1",
"scripts": {
"build": "node node_modules/.bin/jison compiler/pumcl.jison",
"convert2Json": "node node_modules/.bin/jison2json compiler/pumcl.jison > syntaxDiagram/pumcl.json",
"syntaxDiagram": "node node_modules/.bin/browserify syntaxDiagram/main.js > syntaxDiagram/bundle.js",
"build_old": "node node_modules/.bin/jison compiler/classDiagrams.jison"
},
"dependencies": {
"browserify": "14.5.0",
"grammkit": "0.6.0",
"jison": "0.4.18",
"jison2json": "0.0.2"
}
......
# TODO
switch to https://github.com/tabatkins/railroad-diagrams
but needs some work after ebnf generation...
we use http://bottlecaps.de/rr/ui for now
\ No newline at end of file
#!/usr/bin/env bash
# generate the compiler
npm run build
# generate json format from yacc/bison format
node ../node_modules/.bin/jison2json ../compiler/pumcl.jison > pumcl.json
# remove the first line because it includes the source file location...
tail -n +2 "pumcl.json" > "pumcl_clean.json"
node generateEBNF.js "pumcl_clean.json"
echo "now go to http://bottlecaps.de/rr/ui and past the ebnf ... for now"
\ No newline at end of file
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -7,31 +7,47 @@ var fs = require('fs');
var pumclJSON = null //= require('./pumcl.json')
fs.readFile('./pumcl.json', 'utf8', function (err,data) {
if (process.argv.length < 3) {
console.log('NO ARGS!! specify the json ebnf file')
}
//console.log(process.argv)
fs.readFile(process.argv[2], 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
pumclJSON = data
});
var grammar = ''
for(var key in pumclJSON.bnf) {
var rule = pumclJSON.bnf[key]
var parsedPumclEBNF = JSON.parse(pumclJSON)
if (key == 'start') {
grammar += key + " ::= " + rule[0][0] + '\n'
//grammar += key + " ::= " + 'statements' + '\n'
} else {
grammar += key + " ::= " + rule.join(' ') + '\n'
}
}
var grammar = ''
fs.writeFile(".pumcl.ebnf", grammar, function(err) {
if(err) {
return console.log(err);
for(var key in parsedPumclEBNF.bnf) {
var rule = parsedPumclEBNF.bnf[key]
if (key == 'start') {
grammar += key + " ::= " + rule[0][0] + '\n'
//grammar += key + " ::= " + 'statements' + '\n'
} else {
grammar += key + " ::= " + rule.join(' | ') + ' \n'
}
}
console.log("The file was saved!");
fs.writeFile("pumcl.ebnf", grammar, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
});
/**
* Created by janis dähne.
*/
const pumclJSON = require('./pumcl.json')
//console.log(pumclJSON.bnf)
var grammar = ''
for(var key in pumclJSON.bnf) {
var rule = pumclJSON.bnf[key]
if (key == 'start') {
//grammar += key + " ::= " + rule[0][0] + '\n'
grammar += key + " ::= " + 'statements' + '\n'
} else {
grammar += key + " ::= " + rule.join(' ') + '\n'
}
}
console.log(grammar)
const svg = grammkit.diagram(grammar)
console.log(svg)
start ::= statements EOF
emptyStatement ::=
statements ::= NL | statement NL | statements NL | statements statement NL | statements error NL
statement ::= relationWithTextDirected | maybeAbstractClassDefinitionStatement | addToClassStatement | interfaceDefinitionStatement | enumDefinitionStatement | noteDefinitionStatement | packageDefinitionStatement | associationClassDefinitionStatement
fullQualifiedName ::= IDENT | IDENT DOUBLE_COLON fullQualifiedName
relation ::= fullQualifiedName someLine fullQualifiedName | fullQualifiedName STRING someLine fullQualifiedName | fullQualifiedName someLine STRING fullQualifiedName | fullQualifiedName STRING someLine STRING fullQualifiedName
relationWithTextDirected ::= relation | relation COLON STRING | relation COLON ANGEL_BRACKET_OPEN | relation COLON ANGEL_BRACKET_CLOSE | relation COLON ANGEL_BRACKET_OPEN STRING | relation COLON STRING ANGEL_BRACKET_CLOSE
type ::= fullQualifiedName | fullQualifiedName ARRAY_BRACKETS
appliedGenericList ::= maybeGenericType | appliedGenericList COMMA maybeGenericType
appliedGenericDefinition ::= IDENT ANGEL_BRACKET_OPEN appliedGenericList ANGEL_BRACKET_CLOSE | IDENT ANGEL_BRACKET_OPEN appliedGenericList ANGEL_BRACKET_CLOSE ARRAY_BRACKETS
maybeGenericType ::= type | appliedGenericDefinition
classProperty ::= IDENT | IDENT COLON maybeGenericType
methodParamsList ::= classProperty | methodParamsList COMMA classProperty
classMethodParamsList ::= BRACKET_OPEN BRACKET_CLOSE | BRACKET_OPEN methodParamsList BRACKET_CLOSE
genericDefinition ::= IDENT | IDENT COLON maybeGenericType
genericDefinitionList ::= genericDefinition | genericDefinitionList COMMA genericDefinition
genericsDefinition ::= ANGEL_BRACKET_OPEN genericDefinitionList ANGEL_BRACKET_CLOSE
classMethod ::= IDENT classMethodParamsList | IDENT classMethodParamsList COLON maybeGenericType | IDENT genericsDefinition classMethodParamsList | IDENT genericsDefinition classMethodParamsList COLON maybeGenericType
classMemberVisibilityModifier ::= MINUS | HASH | TILDE | PLUS
classMemberCommonModifier ::= CLASS_MEMBER_MODIFIER_STATIC | CLASS_MEMBER_MODIFIER_ABSTRACT
classMemberModifiers ::= classMemberVisibilityModifier | classMemberVisibilityModifier classMemberCommonModifier | classMemberCommonModifier
classMember ::= classProperty | classMethod | classMemberModifiers classProperty | classMemberModifiers classMethod
classMemberList ::= NL | classMember NL | classMemberList NL | classMemberList classMember NL | classMemberList error NL
stereotypeDefinition ::= ANGEL_BRACKET_OPEN ANGEL_BRACKET_OPEN IDENT ANGEL_BRACKET_CLOSE ANGEL_BRACKET_CLOSE
nameDefinition ::= fullQualifiedName | STRING AS fullQualifiedName | fullQualifiedName AS STRING
nameAndMaybeGenericsDefinitionAndMaybeStereotypeDefinition ::= nameDefinition | fullQualifiedName stereotypeDefinition | STRING AS fullQualifiedName stereotypeDefinition | fullQualifiedName AS STRING stereotypeDefinition | fullQualifiedName genericsDefinition | STRING AS fullQualifiedName genericsDefinition | fullQualifiedName genericsDefinition AS STRING | fullQualifiedName genericsDefinition stereotypeDefinition | STRING AS fullQualifiedName genericsDefinition stereotypeDefinition | fullQualifiedName genericsDefinition AS STRING stereotypeDefinition
noClassBody ::=
classBodyDefinition ::= noClassBody | CURL_BRACKET_OPEN NL CURL_BRACKET_CLOSE | CURL_BRACKET_OPEN NL classMemberList CURL_BRACKET_CLOSE
classDefinition ::= CLASS_KEYWORD nameAndMaybeGenericsDefinitionAndMaybeStereotypeDefinition classBodyDefinition
addToClassStatement ::= IDENT COLON classMember
maybeAbstractClassDefinitionStatement ::= classDefinition | ABSTRACT_KEYWORD classDefinition | ABSTRACT_KEYWORD nameAndMaybeGenericsDefinitionAndMaybeStereotypeDefinition classBodyDefinition
interfaceMember ::= classMethod
interfaceMemberList ::= NL | interfaceMember NL | interfaceMemberList NL | interfaceMemberList interfaceMember NL | interfaceMemberList error NL
noInterfaceBody ::=
interfaceBodyDefinition ::= noInterfaceBody | CURL_BRACKET_OPEN NL CURL_BRACKET_CLOSE | CURL_BRACKET_OPEN NL interfaceMemberList CURL_BRACKET_CLOSE
interfaceDefinitionStatement ::= INTERFACE_KEYWORD nameAndMaybeGenericsDefinitionAndMaybeStereotypeDefinition interfaceBodyDefinition
enumMember ::= IDENT | IDENT EQ NUMBER | IDENT EQ STRING
enumMemberList ::= NL | enumMember NL | enumMemberList NL | enumMemberList enumMember NL | enumMemberList error NL
noEnumBody ::=
enumBodyDefinition ::= noEnumBody | CURL_BRACKET_OPEN NL CURL_BRACKET_CLOSE | CURL_BRACKET_OPEN NL enumMemberList CURL_BRACKET_CLOSE
enumDefinitionStatement ::= ENUM_KEYWORD nameDefinition enumBodyDefinition | ENUM_KEYWORD nameDefinition stereotypeDefinition enumBodyDefinition
noteNameDefinition ::= AS IDENT
noteKeywordDirectionOf ::= NOTE_KEYWORD_LEFT_OF | NOTE_KEYWORD_RIGHT_OF | NOTE_KEYWORD_TOP_OF | NOTE_KEYWORD_BOTTOM_OF
noteKeywordDirection ::= NOTE_KEYWORD_LEFT | NOTE_KEYWORD_RIGHT | NOTE_KEYWORD_TOP | NOTE_KEYWORD_BOTTOM
noteKeywordOnLink ::= NOTE_KEYWORD_ON_LINK | NOTE_KEYWORD_LEFT_ON_LINK | NOTE_KEYWORD_RIGHT_ON_LINK | NOTE_KEYWORD_TOP_ON_LINK | NOTE_KEYWORD_BOTTOM_ON_LINK
noteDefinitionStatement ::= NOTE_KEYWORD STRING | NOTE_KEYWORD STRING noteNameDefinition | noteKeywordDirectionOf IDENT COLON STRING | noteKeywordDirection COLON STRING | noteKeywordOnLink COLON STRING
noPackageBody ::=
packageMember ::= maybeAbstractClassDefinitionStatement | interfaceDefinitionStatement | enumDefinitionStatement | packageDefinitionStatement | associationClassDefinitionStatement
packageMemberList ::= NL | packageMember NL | packageMemberList NL | packageMemberList packageMember NL
packageBodyDefinition ::= CURL_BRACKET_OPEN NL CURL_BRACKET_CLOSE | CURL_BRACKET_OPEN NL packageMemberList CURL_BRACKET_CLOSE
packageDefinitionStatement ::= PACKAGE_KEYWORD fullQualifiedName packageBodyDefinition | PACKAGE_KEYWORD fullQualifiedName stereotypeDefinition packageBodyDefinition
associationClassDefinitionStatement ::= BRACKET_OPEN fullQualifiedName COMMA fullQualifiedName BRACKET_CLOSE LINE_DOTTED fullQualifiedName
someLine ::= LINE | LINE_DOTTED | ARROWED_LINE | ARROWED_LINE_DOTTED | ARROWED_LINE_RIGHT | ARROWED_LINE_RIGHT_DOTTED | GENERALIZATION | GENERALIZATION_RIGHT | GENERALIZATION_DOTTED | GENERALIZATION_RIGHT_DOTTED | COMPOSITION | COMPOSITION_DOTTED | COMPOSITION_RIGHT | COMPOSITION_RIGHT_DOTTED | AGGREGATION | AGGREGATION_DOTTED | AGGREGATION_RIGHT | AGGREGATION_RIGHT_DOTTED | ARROWED_LINE_SIMPLE | ARROWED_LINE_DOTTED_SIMPLE | ARROWED_LINE_RIGHT_SIMPLE | ARROWED_LINE_RIGHT_DOTTED_SIMPLE | GENERALIZATION_SIMPLE | GENERALIZATION_RIGHT_SIMPLE | GENERALIZATION_DOTTED_SIMPLE | GENERALIZATION_RIGHT_DOTTED_SIMPLE | COMPOSITION_SIMPLE | COMPOSITION_DOTTED_SIMPLE | COMPOSITION_RIGHT_SIMPLE | COMPOSITION_RIGHT_DOTTED_SIMPLE | AGGREGATION_SIMPLE | AGGREGATION_DOTTED_SIMPLE | AGGREGATION_RIGHT_SIMPLE | AGGREGATION_RIGHT_DOTTED_SIMPLE | BOXED_LINE | BOXED_LINE_DOTTED | BOXED_LINE_RIGHT | BOXED_LINE_RIGHT_DOTTED | XED_LINE | XED_LINE_DOTTED | XED_LINE_RIGHT | XED_LINE_RIGHT_DOTTED | TRIDENT_LINE | TRIDENT_LINE_DOTTED | TRIDENT_LINE_RIGHT | TRIDENT_LINE_RIGHT_DOTTED | CIRCLE_PLUS_LINE | CIRCLE_PLUS_LINE_DOTTED | CIRCLE_PLUS_LINE_RIGHT | CIRCLE_PLUS_LINE_RIGHT_DOTTED | GENERALIZATION_2_LINE | GENERALIZATION_2_LINE_DOTTED | GENERALIZATION_2_LINE_RIGHT | GENERALIZATION_2_LINE_RIGHT_DOTTED | BOXED_LINE_SIMPLE | BOXED_LINE_DOTTED_SIMPLE | BOXED_LINE_RIGHT_SIMPLE | BOXED_LINE_RIGHT_DOTTED_SIMPLE | XED_LINE_SIMPLE | XED_LINE_DOTTED_SIMPLE | XED_LINE_RIGHT_SIMPLE | XED_LINE_RIGHT_DOTTED_SIMPLE | TRIDENT_LINE_SIMPLE | TRIDENT_LINE_DOTTED_SIMPLE | TRIDENT_LINE_RIGHT_SIMPLE | TRIDENT_LINE_RIGHT_DOTTED_SIMPLE | CIRCLE_PLUS_LINE_SIMPLE | CIRCLE_PLUS_LINE_DOTTED_SIMPLE | CIRCLE_PLUS_LINE_RIGHT_SIMPLE | CIRCLE_PLUS_LINE_RIGHT_DOTTED_SIMPLE | GENERALIZATION_2_LINE_SIMPLE | GENERALIZATION_2_LINE_DOTTED_SIMPLE | GENERALIZATION_2_LINE_RIGHT_SIMPLE | GENERALIZATION_2_LINE_RIGHT_DOTTED_SIMPLE
[ '../compiler/pumcl.jison' ]
{
"lex": {
"rules": [
......
This diff is collapsed.
......@@ -3,12 +3,38 @@
<head>
<meta charset="UTF-8">
<title>PUMCL Syntax Diagram</title>
<style>
.rrConnector {fill:none;stroke:#222222;}
.rrRule {fill:#d3f0ff;stroke:#222222;}
.rrRuleText {fill:#000000;font-family:Verdana,Sans-serif;font-size:12px;}
.rrLiteral {fill:#90d9ff;stroke:#222222;}
.rrLiteralText {fill:#000000;font-family:Verdana,Sans-serif;font-size:12px;}
.rrSpecialSequence {fill:#e4f4ff;stroke:#222222;}
.rrSpecialSequenceText {fill:#000000;font-family:Verdana,Sans-serif;font-size:12px;}
.rrLoopCardinalities {fill:#000000;font-family:Verdana,Sans-serif;font-size:10px;}
</style>
</head>
<body>
<pre class="BNF">
start = statements EOF \
NL = 'nl' \
statement = 'X' \
statements statement \
</pre>
<script src="../pumcl.js"></script>
<script src="bundle.js"></script>
<script src="rrdiagram.js"></script>
<script>
var bnfDisplay = new rrdiagram.bnfdisplay.BNFDisplay();
bnfDisplay.replaceBNF('BNF', 'BNFSVG');
</script>
</body>
</html>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment