mirror of
https://github.com/marcin-szczepanski/jFuzzyLogic.git
synced 2024-12-24 18:00:28 +01:00
182 lines
4.8 KiB
Plaintext
182 lines
4.8 KiB
Plaintext
/*
|
|
[The "BSD licence"]
|
|
Copyright (c) 2005-2006 Terence Parr
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
3. The name of the author may not be used to endorse or promote products
|
|
derived from this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
/** Template subgroup to add template rewrite output
|
|
* If debugging, then you'll also get STDbg.stg loaded.
|
|
*/
|
|
group ST;
|
|
|
|
@outputFile.imports() ::= <<
|
|
<@super.imports()>
|
|
import stringtemplate3
|
|
>>
|
|
|
|
/** Add this to each rule's return value struct */
|
|
@returnScope.ruleReturnInit() ::= <<
|
|
self.st = None
|
|
>>
|
|
|
|
@returnScope.ruleReturnMembers() ::= <<
|
|
def getTemplate(self):
|
|
return self.st
|
|
|
|
def toString(self):
|
|
if self.st is not None:
|
|
return self.st.toString()
|
|
return None
|
|
__str__ = toString
|
|
|
|
>>
|
|
|
|
@genericParser.init() ::= <<
|
|
<@super.init()>
|
|
self.templateLib = stringtemplate3.StringTemplateGroup(
|
|
'<name>Templates', lexer='angle-bracket'
|
|
)
|
|
|
|
>>
|
|
|
|
@genericParser.members() ::= <<
|
|
<@super.members()>
|
|
def setTemplateLib(self, templateLib):
|
|
self.templateLib = templateLib
|
|
|
|
def getTemplateLib(self):
|
|
return self.templateLib
|
|
|
|
>>
|
|
|
|
/** x+=rule when output=template */
|
|
ruleRefAndListLabel(rule,label,elementIndex,args,scope) ::= <<
|
|
<ruleRef(...)>
|
|
<listLabel(elem=label+".st",...)>
|
|
>>
|
|
|
|
rewriteTemplate(alts) ::= <<
|
|
# TEMPLATE REWRITE
|
|
<if(backtracking)>
|
|
if self._state.backtracking == 0:
|
|
<first(alts):rewriteTemplateAltFirst()>
|
|
<rest(alts):{el<rewriteTemplateAlt()>}>
|
|
<if(rewriteMode)><replaceTextInLine()><endif>
|
|
|
|
<else>
|
|
<first(alts):rewriteTemplateAltFirst()>
|
|
<rest(alts):{el<rewriteTemplateAlt()>}>
|
|
<if(rewriteMode)><replaceTextInLine()><endif>
|
|
<endif>
|
|
>>
|
|
|
|
replaceTextInLine() ::= <<
|
|
<if(TREE_PARSER)>
|
|
self.input.getTokenStream().replace(
|
|
self.input.getTreeAdaptor().getTokenStartIndex(retval.start),
|
|
self.input.getTreeAdaptor().getTokenStopIndex(retval.start),
|
|
retval.st
|
|
)
|
|
<else>
|
|
self.input.replace(
|
|
retval.start.getTokenIndex(),
|
|
self.input.LT(-1).getTokenIndex(),
|
|
retval.st
|
|
)
|
|
<endif>
|
|
>>
|
|
|
|
rewriteTemplateAltFirst() ::= <<
|
|
<if(it.pred)>
|
|
if <it.pred>:
|
|
# <it.description>
|
|
retval.st = <it.alt>
|
|
<\n>
|
|
<else>
|
|
# <it.description>
|
|
retval.st = <it.alt>
|
|
<\n>
|
|
<endif>
|
|
>>
|
|
|
|
rewriteTemplateAlt() ::= <<
|
|
<if(it.pred)>
|
|
if <it.pred>:
|
|
# <it.description>
|
|
retval.st = <it.alt>
|
|
<\n>
|
|
<else>
|
|
se:
|
|
# <it.description>
|
|
retval.st = <it.alt>
|
|
<\n>
|
|
<endif>
|
|
>>
|
|
|
|
rewriteEmptyTemplate(alts) ::= <<
|
|
None
|
|
>>
|
|
|
|
/** Invoke a template with a set of attribute name/value pairs.
|
|
* Set the value of the rule's template *after* having set
|
|
* the attributes because the rule's template might be used as
|
|
* an attribute to build a bigger template; you get a self-embedded
|
|
* template.
|
|
*/
|
|
rewriteExternalTemplate(name,args) ::= <<
|
|
self.templateLib.getInstanceOf("<name>"<if(args)>,
|
|
attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}<endif>)
|
|
>>
|
|
|
|
/** expr is a string expression that says what template to load */
|
|
rewriteIndirectTemplate(expr,args) ::= <<
|
|
self.templateLib.getInstanceOf(<expr><if(args)>,
|
|
attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}<endif>)
|
|
>>
|
|
|
|
/** Invoke an inline template with a set of attribute name/value pairs */
|
|
rewriteInlineTemplate(args, template) ::= <<
|
|
stringtemplate3.StringTemplate(
|
|
"<template>",
|
|
group=self.templateLib<if(args)>,
|
|
attributes={<args:{a | "<a.name>": <a.value>}; separator=", ">}
|
|
<endif>
|
|
)
|
|
>>
|
|
|
|
/** plain -> {foo} action */
|
|
rewriteAction(action) ::= <<
|
|
<action>
|
|
>>
|
|
|
|
/** An action has %st.attrName=expr; or %{st}.attrName=expr; */
|
|
actionSetAttribute(st,attrName,expr) ::= <<
|
|
(<st>)["<attrName>"] = <expr>
|
|
>>
|
|
|
|
/** Translate %{stringExpr} */
|
|
actionStringConstructor(stringExpr) ::= <<
|
|
stringtemplate3.StringTemplate(<stringExpr>, group=self.templateLib)
|
|
>>
|