onelang
Version:
OneLang transpiler framework core
273 lines (254 loc) • 7.98 kB
YAML
name: cpp
extension: cpp
casing:
class: pascal_case
method: camel_case
field: snake_case
property: snake_case
variable: snake_case
enum: pascal_case
enumMember: pascal_case
primitiveTypes:
void: void
any: any
templates:
testGenerator: |-
int main()
{
try {
{{class}} c;
c.{{method}}();
} catch(std::exception& err) {
std::cout << "Exception: " << err.what() << '\n';
}
return 0;
}
main: |-
#include <one.hpp>
{{for inc in includes|sep=\n}}
#include <{{inc.source}}>
{{/for}}
{{for enum in enums|sep=\n}}
enum class {{enum.name}} {
{{for item in enum.values|inline sep=", "}}
{{item.name}}
{{/for}}
};
const char* {{enum.name}}ToStr[] = {
{{for item in enum.values|inline sep=", "}}
"{{item.origName}}"
{{/for}}
};
{{/for}}
{{for interface in interfaces|sep=\n\n}}
{{genClassSignature(interface)}} {
public:
{{for method in interface.methods|sep="\n \n"}}
virtual {{getType(method.returnTypeInfo)}} {{method.name}}({{genArgs(method)}}) = 0;
{{/for}}
};
{{/for}}
{{for class in classes|sep=\n\n}}
{{genClassSignature(class)}} {
public:
{{genFields(class.publicFields)}}
{{if class.constructor}}
{{class.name}}({{genArgs(class.constructor)}}) {
{{genBody(class.constructor.body)}}
}
{{/if}}
{{genMethods(class.publicMethods)}}
private:
{{genFields(class.privateFields)}}
{{genMethods(class.privateMethods)}}
};
{{for field in class.fields|sep=\n}}
{{if field.static && field.initializer}}
{{getType(field.typeInfo)}} {{class.name}}::{{field.name}} = {{gen(field.initializer)}};
{{/if}}
{{/for}}
{{afterClass(class)}}
{{/for}}
{{if mainBlock.statements.length > 0}}
int main()
{
{{genBody(mainBlock)}}
return 0;
}
{{/if}}
genFields:
args:
- name: fields
template: |-
{{for field in fields|sep=\n}}
{{if field.static}}static {{/if}}{{getType(field.typeInfo)}} {{field.name}}{{if !field.static && field.initializer}} = {{gen(field.initializer)}}{{/if}};
{{/for}}
getType:
args:
- name: item
template: |-
{{if item.isComplexClass && !item.isOneArray}}
sp<{{typeName(item)}}>
{{elif item.isOneArray}}
vec<{{getType(item.typeArguments[0])}}>
{{else}}
{{typeName(item)}}
{{/if}}
getTypeX:
args:
- name: type
template: "{{typeName(type)}}{{if type.isComplexClass}}*{{/if}}"
genMethods:
args:
- name: methods
template: |-
{{for method in methods|sep=\n\n}}
{{if method.static}}static {{/if}}{{if method.attributes["virtual"]}}virtual {{/if}}{{getType(method.returnTypeInfo)}} {{method.name}}({{genArgs(method)}}) {
{{genBody(method.body)}}
}
{{/for}}
genClassSignature:
args: [{name: class}]
template: |-
{{if class.typeArguments|inline}}
template<
{{for arg in class.typeArguments|inline sep=", "}}
typename {{arg}}
{{/for}}
>
{{/if}}
class {{class.name}}
{{if class.baseClasses.length > 0 or class.attributes["reflect"]|inline}}
:
{{for item in class.baseClasses|inline sep=", "}}
public {{item}}
{{/for}}
{{if class.attributes["reflect"]}}
{{if class.baseClasses.length > 0}}, {{/if}}public ReflectedClass
{{/if}}
{{/if}}
genBody:
args:
- name: body
template: |-
{{for statement in body.statements|sep=\n}}
{{statement.leadingTrivia}}{{gen(statement)}}
{{/for}}
genArgs:
args:
- name: method
template: |-
{{for param in method.parameters|sep=", "}}
{{param.type}} {{param.name}}
{{/for}}
genParams:
args:
- name: params
template: |-
{{for param in params|sep=", " inline}}
{{gen(param)}}
{{/for}}
genVar:
args:
- name: itemVar
template: |-
{{if itemVar.type.isNumber}}int{{else}}auto{{/if}} {{itemVar.outName}} = {{gen(itemVar.initializer)}}
genWithParen:
args: [{ name: expr }]
template: |-
{{if expr.exprKind == "Binary" or expr.exprKind == "Conditional"}}
({{gen(expr)}})
{{else}}
{{gen(expr)}}
{{/if}}
afterClass: { args: [class], template: "" }
expressions:
call: |-
{{gen(expr.method)}}(
{{for arg in expr.arguments|sep=", " inline}}
{{gen(arg)}}
{{/for}}
)
propertyAccess: "{{gen(expr.object)}}->{{gen(expr.propertyName)}}"
identifier: "{{expr.text}}"
stringLiteral: 'std::string("{{expr.escapedText}}")'
characterLiteral: "'{{expr.escapedTextSingle}}'"
return: "return{{if expr.expression}} {{gen(expr.expression)}}{{/if}};"
binary: "{{gen(expr.left)}} {{expr.operator}} {{gen(expr.right)}}"
postfix: "{{gen(expr.operand)}}{{expr.operator}}"
prefix: "{{expr.operator}}{{gen(expr.operand)}}"
throw: "throw {{gen(expr.expression)}};"
parenthesized: "({{gen(expr.expression)}})"
numericLiteral: "{{expr.value}}"
nullLiteral: "nullptr"
variableDeclaration: "{{genVar(expr)}};"
new: |-
std::make_shared<{{gen(expr.cls)}}
{{if expr.typeArguments.length > 0|inline}}
<
{{for arg in expr.typeArguments|inline sep=", "}}
{{typeName(arg)}}
{{/for}}
>
{{/if}}
>({{genParams(expr.arguments)}})
classReference: "{{expr.classRef.outName}}"
enumReference: "{{expr.enumRef.outName}}"
enumMemberReference: "{{expr.enumRef.outName}}::{{expr.enumMemberRef.outName}}"
expressionStatement: "{{gen(expr.expression)}};"
instanceMethod: "{{gen(expr.thisExpr)}}->{{expr.methodRef.outName}}"
staticMethod: "{{expr.methodRef.classRef.outName}}::{{expr.methodRef.outName}}"
localVar: "{{expr.varRef.outName}}"
methodArgument: "{{expr.varRef.outName}}"
instanceField: "{{gen(expr.thisExpr)}}->{{expr.varRef.outName}}"
staticField: "{{gen(expr.thisExpr)}}::{{expr.varRef.outName}}"
falseLiteral: "false"
trueLiteral: "true"
elementAccess: "(*{{gen(expr.object)}})[{{gen(expr.elementExpr)}}]"
thisReference: this
cast: "static_cast<{{typeName(expr.newType)}}>({{gen(expr.expression)}})"
conditional: "{{gen(expr.condition)}} ? {{gen(expr.whenTrue)}} : {{gen(expr.whenFalse)}}"
templateString: |-
{{for part in expr.parts|sep=" + " inline}}
{{if part_idx == 0|inline}}std::string({{/if}}
{{if part.literal|inline}}
"{{escapeQuotes(part.text)}}"
{{elif part.expr.valueType.isNumber|inline}}
std::to_string({{gen(part.expr)}})
{{elif part.expr.valueType.isEnum|inline}}
{{part.expr.valueType.enumName}}ToStr[(int)({{gen(part.expr)}})]
{{elif part.expr.valueType.isBoolean|inline}}
({{genWithParen(part.expr)}} ? "true" : "false")
{{else}}
{{genWithParen(part.expr)}}
{{/if}}
{{if part_idx == 0|inline}}){{/if}}
{{/for}}
foreach: |-
for (auto it = {{gen(expr.items)}}->begin(); it != {{gen(expr.items)}}->end(); ++it) {
auto {{expr.itemVariable.outName}} = *it;
{{genBody(expr.body)}}
}
for: |-
for ({{genVar(expr.itemVariable)}}; {{gen(expr.condition)}}; {{gen(expr.incrementor)}}) {
{{genBody(expr.body)}}
}
while: |-
while ({{gen(expr.condition)}}) {
{{genBody(expr.body)}}
}
break: break;
if: |-
if ({{gen(expr.condition)}}) {
{{genBody(expr.then)}}
}
{{if expr.else|inline}}
{{" "}}
{{if isIfBlock(expr.else)|inline}}
else {{genBody(expr.else)|inline}}
{{else}}
else {
{{genBody(expr.else)}}
}
{{/if}}
{{/if}}