dragonfly-grammars/_cs_grammar.py

187 lines
7.4 KiB
Python
Raw Normal View History

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):
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