Skip to content

Commit

Permalink
Merge pull request #4128 from sorig/meta_lang_kwargs2
Browse files Browse the repository at this point in the history
Extend the meta-language to support keyword arguments
  • Loading branch information
karlnapf committed Feb 3, 2018
2 parents d33ba71 + c71feba commit 1079c51
Show file tree
Hide file tree
Showing 12 changed files with 319 additions and 73 deletions.
4 changes: 2 additions & 2 deletions examples/meta/generator/generate.py
Expand Up @@ -69,8 +69,8 @@ def translateExamples(inputDir, outputDir, targetsDir, ctagsFile,
# print("Translating {}".format(os.sep.join([dirRelative, filename])))

# Parse the example file
filePath = os.path.join(dirRelative, filename)
with open(os.path.join(inputDir, dirRelative, filename), 'r') as file:
filePath = os.path.join(inputDir, dirRelative, filename)
with open(filePath, 'r') as file:
ast = parse(file.read(), filePath, generatedFilesOutputDir)

# Translate ast to each target language
Expand Down
36 changes: 25 additions & 11 deletions examples/meta/generator/parse.py
Expand Up @@ -2,6 +2,7 @@
import json
import argparse
import ply
import os


# The FastParser parses input using PLY
Expand All @@ -24,7 +25,7 @@ def __init__(self, generatedFilesOutputDir=None):
outputdir=generatedFilesOutputDir,
debug=generateFiles)

def parse(self, programString, filePath="Unknown"):
def parse(self, programString, filePath=None):
"""
Parse a program string.
The path of the program file is added as metadata to returned object
Expand All @@ -36,7 +37,10 @@ def parse(self, programString, filePath="Unknown"):

# Parse program and add FilePath key to object
program = self.parser.parse(programString)
program["FilePath"] = filePath
if filePath is not None:
program["FilePath"] = os.path.abspath(filePath)
else:
program["FilePath"] = "Unknown"

return program

Expand Down Expand Up @@ -181,15 +185,6 @@ def p_objectType(self, p):
"objecttype : IDENTIFIER"
p[0] = {"ObjectType": p[1]}

def p_argumentList_nonEmpty(self, p):
"""
argumentListNonEmpty : expr
| expr COMMA argumentListNonEmpty
"""
p[0] = [p[1]]
if len(p) > 2:
p[0].extend(p[3])

def p_argumentList(self, p):
"""
argumentList : argumentListNonEmpty
Expand All @@ -201,6 +196,25 @@ def p_argumentList(self, p):

p[0] = {"ArgumentList": arguments}

def p_argumentListNonEmpty(self, p):
"""
argumentListNonEmpty : argumentListElement
| argumentListElement COMMA argumentListNonEmpty
"""
p[0] = [p[1]]
if len(p) > 2:
p[0].extend(p[3])

def p_argumentListElement(self, p):
"""
argumentListElement : expr
| identifier EQUALS expr
"""
if "Expr" in p[1]:
p[0] = p[1]
else:
p[0] = {"KeywordArgument": [p[1], p[3]]}

def p_identifier(self, p):
"identifier : IDENTIFIER"
p[0] = {"Identifier": p[1]}
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/cpp.json
Expand Up @@ -10,8 +10,14 @@
"Statement": "$statement;\n",
"Comment": "//$comment\n",
"Init": {
"Construct": "auto $name = some<C$typeName>($arguments)",
"Copy": "auto $name = $expr",
"Construct": "auto $name = some<C$typeName>($arguments)$kwargs",
"Copy": "auto $name = $expr$kwargs",
"KeywordArguments": {
"List": ";\n$elements",
"Element": "$name->put(\"$keyword\", $expr)",
"Separator": ";\n",
"InitialSeperatorWhenArgs>0": false
},
"BoolVector": "auto $name = SGVector<bool>($arguments)",
"CharVector": "auto $name = SGVector<char>($arguments)",
"ByteVector": "auto $name = SGVector<uint8_t>($arguments)",
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/csharp.json
Expand Up @@ -3,8 +3,14 @@
"Statement": "$statement;\n",
"Comment": "//$comment\n",
"Init": {
"Construct": "$typeName $name = new $typeName($arguments)",
"Copy": "$typeName $name = $expr",
"Construct": "$typeName $name = new $typeName($arguments)$kwargs",
"Copy": "$typeName $name = $expr$kwargs",
"KeywordArguments": {
"List": ";\n$elements",
"Element": "$name.put(\"$keyword\", $expr)",
"Separator": ";\n",
"InitialSeperatorWhenArgs>0": false
},
"CharVector": "var $name = new char[$arguments]",
"ByteVector": "var $name = new byte[$arguments]",
"WordVector": "var $name = new ushort[$arguments]",
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/java.json
Expand Up @@ -10,8 +10,14 @@
"Statement": "$statement;\n",
"Comment": "//$comment\n",
"Init": {
"Construct": "$typeName $name = new $typeName($arguments)",
"Copy": "$typeName $name = $expr",
"Construct": "$typeName $name = new $typeName($arguments)$kwargs",
"Copy": "$typeName $name = $expr$kwargs",
"KeywordArguments": {
"List": ";\n$elements",
"Element": "$name.put(\"$keyword\", $expr)",
"Separator": ";\n",
"InitialSeperatorWhenArgs>0": false
},
"CharVector": "DoubleMatrix $name = new DoubleMatrix(1, $arguments)",
"ByteVector": "DoubleMatrix $name = new DoubleMatrix(1, $arguments)",
"WordVector": "DoubleMatrix $name = new DoubleMatrix(1, $arguments)",
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/lua.json
Expand Up @@ -3,8 +3,14 @@
"Statement": "$statement\n",
"Comment": "--$comment\n",
"Init": {
"Construct": "$name = shogun.$typeName($arguments)",
"Copy": "$name = $expr"
"Construct": "$name = shogun.$typeName($arguments)$kwargs",
"Copy": "$name = $expr$kwargs",
"KeywordArguments": {
"List": "\n$elements",
"Element": "$name:put(\"$keyword\", $expr)",
"Separator": "\n",
"InitialSeperatorWhenArgs>0": false
}
},
"Assign": "$identifier = $expr",
"Type": {
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/octave.json
Expand Up @@ -3,8 +3,14 @@
"Statement": "$statement;\n",
"Comment": "%$comment\n",
"Init": {
"Construct": "$name = $typeName($arguments)",
"Copy": "$name = $expr",
"Construct": "$name = $typeName($arguments)$kwargs",
"Copy": "$name = $expr$kwargs",
"KeywordArguments": {
"List": ";\n$elements",
"Element": "$name.put(\"$keyword\", $expr)",
"Separator": ";\n",
"InitialSeperatorWhenArgs>0": false
},
"CharVector": "$name = zeros(1, $arguments, 'char')",
"ByteVector": "$name = zeros(1, $arguments, 'int8')",
"WordVector": "$name = zeros(1, $arguments, 'int16')",
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/python.json
Expand Up @@ -12,8 +12,14 @@
"Statement": "$statement\n",
"Comment": "#$comment\n",
"Init": {
"Construct": "$name = $typeName($arguments)",
"Copy": "$name = $expr",
"Construct": "$name = $typeName($arguments)$kwargs",
"Copy": "$name = $expr$kwargs",
"KeywordArguments": {
"List": "\n$elements",
"Element": "$name.put(\"$keyword\", $expr)",
"Separator": "\n",
"InitialSeperatorWhenArgs>0": false
},
"BoolVector": "$name = np.zeros( ($arguments), dtype='bool')",
"CharVector": "$name = np.zeros( ($arguments), dtype='|S1')",
"ByteVector": "$name = np.zeros( ($arguments), dtype='uint8')",
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/r.json
Expand Up @@ -3,8 +3,14 @@
"Statement": "$statement\n",
"Comment": "#$comment\n",
"Init": {
"Construct": "$name <- $typeName($arguments)",
"Copy": "$name <- $expr"
"Construct": "$name <- $typeName($arguments)$kwargs",
"Copy": "$name <- $expr$kwargs",
"KeywordArguments": {
"List": "\n$elements",
"Element": "$name$$put('$keyword', $expr)",
"Separator": "\n",
"InitialSeperatorWhenArgs>0": false
}
},
"Assign": "$identifier <- $expr",
"Type": {
Expand Down
10 changes: 8 additions & 2 deletions examples/meta/generator/targets/ruby.json
Expand Up @@ -3,8 +3,14 @@
"Statement": "$statement\n",
"Comment": "#$comment\n",
"Init": {
"Construct": "$name = Shogun::$typeName.new $arguments",
"Copy": "$name = $expr",
"Construct": "$name = Shogun::$typeName.new $arguments$kwargs",
"Copy": "$name = $expr$kwargs",
"KeywordArguments": {
"List": "\n$elements",
"Element": "$name.put \"$keyword\", $expr",
"Separator": "\n",
"InitialSeperatorWhenArgs>0": false
},
"CharVector": "$name = NArray.byte($arguments)",
"ByteVector": "$name = NArray.byte($arguments)",
"WordVector": "$name = NArray.byte($arguments)",
Expand Down

0 comments on commit 1079c51

Please sign in to comment.