2019-08-02 15:25:33 -05:00
|
|
|
# Author:Brandon Lovrien
|
|
|
|
# This script includes the macros for the C# programming language
|
|
|
|
|
|
|
|
from dragonfly import (Grammar, CompoundRule, Dictation, Text, Key, AppContext, MappingRule, Integer)
|
|
|
|
|
|
|
|
class CSEnabler(CompoundRule):
|
2022-02-10 07:19:17 -06:00
|
|
|
spec = "Enable charlie sharp" # Spoken form of command.
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
|
|
|
csBootstrap.disable()
|
|
|
|
csGrammar.enable()
|
2021-02-12 12:26:10 -06:00
|
|
|
print ("C# grammar enabled")
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
class CSDisabler(CompoundRule):
|
|
|
|
spec = "switch language" # Spoken form of command.
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
|
|
|
csGrammar.disable()
|
|
|
|
csBootstrap.enable()
|
2021-02-12 12:26:10 -06:00
|
|
|
print ("C# grammar disabled")
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
# This is a test rule to see if the C# grammar is enabled
|
|
|
|
class CSTestRule(CompoundRule):
|
|
|
|
spec = "test C sharp" # Spoken form of command.
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
def _process_recognition(self, node, extras): # Callback when command is spoken.
|
2021-02-12 12:26:10 -06:00
|
|
|
print ("C# grammar tested")
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
# Handles C# commenting syntax
|
|
|
|
class CSCommentsSyntax(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"comment": Text("// "),
|
|
|
|
"multiline comment": Text("/*") + Key("enter") + Key("enter") + Text("*/") + Key("up")
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
# Deals with printing C# datatypes
|
|
|
|
class CSDataTypes(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"integer": Text("int "),
|
|
|
|
"float": Text("float "),
|
|
|
|
"float <n>": Text("float%(n)d "),
|
|
|
|
"double": Text("double "),
|
|
|
|
"boolean": Text("bool "),
|
|
|
|
"char": Text("char "),
|
|
|
|
"string": Text("string "),
|
|
|
|
"long": Text("long ")
|
|
|
|
}
|
|
|
|
extras = [
|
|
|
|
Integer("n", 0, 64)
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
]
|
|
|
|
|
|
|
|
# This rule deals with the C# comparison operators
|
|
|
|
class CSComparisonOperators(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"equal to": Text("=="),
|
|
|
|
"not equal to": Text("!="),
|
|
|
|
"greater than": Text(">"),
|
|
|
|
"less than": Text("<"),
|
|
|
|
"less than or equal to": Text("<="),
|
|
|
|
"greater than or equal to": Text(">="),
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
# This rule deals with the C# Boolean operators
|
|
|
|
class CSBooleanOperators(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"logical and": Text("&&"),
|
|
|
|
"logical or": Text("||"),
|
|
|
|
"true": Text("true"),
|
|
|
|
"false": Text("false"),
|
|
|
|
"not": Text("!")
|
2021-02-12 12:26:10 -06:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
class CSControlStructures(MappingRule):
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
mapping = {
|
|
|
|
"code block": Text("{") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"if": Text("if() {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"if else": Text("if() {") + Key("enter")+ Key("enter") + Text("}") + Key("enter") + Text("else {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"else if": Text("else if() {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"while loop": Text("while() {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"do while loop": Text("do {") + Key("enter") + Key("down") + Text("while()"),
|
|
|
|
"for loop": Text("for(;;) {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"for each loop": Text("foreach() {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"switch statement": Text("switch() {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"try catch": Text("try {") + Key("enter")+ Key("enter") + Text("}") + Key("enter") + Text("catch(Exception e) {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"class": Text("<access modifier> class ClassName {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"interface": Text("<access modifier> interface InterfaceName {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"enumeration": Text("<access modifier> enum EnumName {") + Key("enter")+ Key("enter") + Text("}"),
|
|
|
|
"method": Text("<datatype> methodName() {") + Key("enter") + Key("enter") + Text("}"),
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
# This rule provides some useful method calls in C#
|
|
|
|
class CSUsefulMethods(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
2021-02-12 12:26:10 -06:00
|
|
|
"print statement": Text("Console.WriteLine()") + Key("left"),
|
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
# This rule deals with some of the C# arithmetic operators
|
|
|
|
class CSArithmeticOperators(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"plus plus": Text("++"),
|
|
|
|
"minus minus": Text("--"),
|
|
|
|
"multiplied by": Text("*"),
|
|
|
|
"plus": Text("+"),
|
|
|
|
"minus": Text("-"),
|
|
|
|
"divided by": Text("/"),
|
|
|
|
"modulus": Text("%") #causes some weird problem in dragonfly so this doesn't work, use "percent sign" instead
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
class CSAssignmentOperators(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"plus equals": Text("+="),
|
|
|
|
"minus equals": Text("-="),
|
|
|
|
"multiply equals": Text("*="),
|
|
|
|
"divide equals": Text("/="),
|
2021-02-12 12:26:10 -06:00
|
|
|
|
|
|
|
|
|
|
|
}
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
class CSMiscellaneousStuff(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"equals": Text(" = "),
|
|
|
|
"new": Text("new "),
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
class CSAccessModifiers(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"public": Text("public "),
|
|
|
|
"private": Text("private "),
|
|
|
|
"protected": Text("protected ")
|
2021-02-12 12:26:10 -06:00
|
|
|
|
2019-08-02 15:25:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
class CSEscapeSequences(MappingRule):
|
|
|
|
|
|
|
|
mapping = {
|
|
|
|
"escape quotes": Text("\ ")+ Key("left") + Text("\"") + Text("\ ")+ Key("left") + Text("\""),
|
|
|
|
"escape single quotes": Text("\ ")+ Key("left") + Text("\'") + Text("\ ")+ Key("left") + Text("\'"),
|
|
|
|
"escape line": Text("\ ")+ Key("left") + Text("n"),
|
2021-02-12 12:26:10 -06:00
|
|
|
"escape tab": Text("\ ")+ Key("left") + Text("t"),
|
2019-08-02 15:25:33 -05:00
|
|
|
"escape carriage return": Text("\ ")+ Key("left") + Text("r"),
|
2021-02-12 12:26:10 -06:00
|
|
|
}
|
2019-08-02 15:25:33 -05:00
|
|
|
|
|
|
|
# The main C# grammar rules are activated here
|
2021-02-12 12:26:10 -06:00
|
|
|
csBootstrap = Grammar("C sharp bootstrap")
|
2019-08-02 15:25:33 -05:00
|
|
|
csBootstrap.add_rule(CSEnabler())
|
|
|
|
csBootstrap.load()
|
|
|
|
|
|
|
|
csGrammar = Grammar("C sharp grammar")
|
|
|
|
csGrammar.add_rule(CSTestRule())
|
|
|
|
csGrammar.add_rule(CSCommentsSyntax())
|
|
|
|
csGrammar.add_rule(CSDataTypes())
|
|
|
|
csGrammar.add_rule(CSComparisonOperators())
|
|
|
|
csGrammar.add_rule(CSBooleanOperators())
|
|
|
|
csGrammar.add_rule(CSControlStructures())
|
|
|
|
csGrammar.add_rule(CSUsefulMethods())
|
|
|
|
csGrammar.add_rule(CSArithmeticOperators())
|
|
|
|
csGrammar.add_rule(CSAssignmentOperators())
|
|
|
|
csGrammar.add_rule(CSMiscellaneousStuff())
|
|
|
|
csGrammar.add_rule(CSAccessModifiers())
|
|
|
|
csGrammar.add_rule(CSEscapeSequences())
|
|
|
|
csGrammar.add_rule(CSDisabler())
|
|
|
|
csGrammar.load()
|
|
|
|
csGrammar.disable()
|
|
|
|
|
|
|
|
|
|
|
|
# Unload function which will be called by natlink at unload time.
|
|
|
|
def unload():
|
|
|
|
global csGrammar
|
|
|
|
if csGrammar: csGrammar.unload()
|
2021-02-12 12:26:10 -06:00
|
|
|
csGrammar = None
|