⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ruby.stg

📁 ANTLR(ANother Tool for Language Recognition)它是这样的一种工具
💻 STG
📖 第 1 页 / 共 3 页
字号:
# <description>case <LA(k)>    <edges; separator="\n">    <if(eotPredictsAlt)><\n>    else        alt<decisionNumber> = <eotPredictsAlt>    <endif>end>>dfaEdgeSwitch(labels, targetState)::=<<<if(PARSER)>when <labels:{:<it>}; separator=","><\n><else>when <labels:{<it>}; separator=","><\n><endif>    <targetState>>>// C y c l i c  D F A/** The code to initiate execution of a cyclic DFA; this is used *  in the rule to predict an alt just like the fixed DFA case. *  The <name> attribute is inherited via the parser, lexer, ... */dfaDecision(decisionNumber,description)::=<<alt<decisionNumber> = DFA<decisionNumber>.predict(@input)>>/** Generate the tables and support code needed for the DFAState object *  argument.  Unless there is a semantic predicate (or syn pred, which *  become sem preds), all states should be encoded in the state tables. *  Consequently, cyclicDFAState/cyclicDFAEdge,eotDFAEdge templates are *  not used except for special DFA states that cannot be encoded as *  a transition table. */cyclicDFA(dfa)::=<<DFA<dfa.decisionNumber> = DFA.new(    [<dfa.eot; wrap="\n     ", separator=",", null="-1">],    [<dfa.eof; wrap="\n     ", separator=",", null="-1">],    [<dfa.min; wrap="\n     ", separator=",", null="0">],    [<dfa.max; wrap="\n     ", separator=",", null="0">],    [<dfa.accept; wrap="\n     ", separator=",", null="-1">],    [<dfa.special; wrap="\n     ", separator=",", null="-1">],    [        <dfa.transition:{s | [<s; wrap="\n     ", separator=",", null="-1">]}; separator=",\n", null="">    ])>>/** A special state in a cyclic DFA; special means has a semantic predicate *  or it's a huge set of symbols to check. */cyclicDFAState(decisionNumber,stateNumber,edges,needErrorClause,semPredState)::=<<    raise "cyclicDFAState not yet implemented">>/** Just like a fixed DFA edge, test the lookahead and indicate what *  state to jump to next if successful.  Again, this is for special *  states. */cyclicDFAEdge(labelExpr, targetStateNumber, edgeNumber, predicates)::=<<s = <targetStateNumber> if (<labelExpr>) <if(predicates)>&& (<predicates>)<endif><\n>>>/** An edge pointing at end-of-token; essentially matches any char; *  always jump to the target. */eotDFAEdge(targetStateNumber,edgeNumber, predicates)::=<<s = <targetStateNumber><\n>>>// D F A  E X P R E S S I O N SandPredicates(left,right)::= "(<left> && <right>)"orPredicates(operands)::=<<(<operands; separator=" || ">)>>notPredicate(pred)::= "!(<evalPredicate(...)>)"evalPredicate(pred,description)::= "(<pred>)"evalSynPredicate(pred,description)::= "<pred>()"/** *  It's not really clear that decisionNumber and stateNumber are available here */lookaheadTest(atom,k,atomAsInt)::=<<<if(LEXER)>look_ahead<decisionNumber>_<stateNumber> == <atom><else>look_ahead<decisionNumber>_<stateNumber> == :<atom><endif>>>/** Sometimes a lookahead test cannot assume that LA(k) is in a temp variable *  somewhere.  Must ask for the lookahead directly. */isolatedLookaheadTest(atom,k,atomAsInt) ::=<<<if(LEXER)><LA(k)> == <atom><else><LA(k)> == :<atom><endif>>>/** *  It's not really clear that decisionNumber and stateNumber are available here */lookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt)::=<<<if(LEXER)>(look_ahead<decisionNumber>_<stateNumber> \>= <lower> && look_ahead<decisionNumber>_<stateNumber> \<= <upper>)<else>(TOKENS[look_ahead<decisionNumber>_<stateNumber>] \>= <lowerAsInt> && TOKENS[look_ahead<decisionNumber>_<stateNumber>] \<= <upperAsInt>)<endif>>>isolatedLookaheadRangeTest(lower,upper,k,rangeNumber,lowerAsInt,upperAsInt) ::=<<<if(LEXER)>(<LA(k)> \>= <lower> && <LA(k)> \<= <upper>)<else>(TOKENS[<LA(k)>] \>= <lowerAsInt> && TOKENS[<LA(k)>] \<= <upperAsInt>)<endif>>>setTest(ranges) ::=<<<ranges; separator=" || ">>>// A T T R I B U T E SparameterAttributeRef(attr)::=<<    ---- parameterAttributeRef ----    attr: <attr>    ---- /parameterAttributeRef ---->>scopeAttributeRef(scope,attr,index,negIndex)::=<<    ---- scopeAttributeRef ----    scope: <scope>    attr: <attr>    index: <index>    negIndex: <negIndex>    ---- /scopeAttributeRef ---->>/** $x is either global scope or x is rule with dynamic scope; refers *  to stack itself not top of stack.  This is useful for predicates *  like {$function.size()>0 && $function::name.equals("foo")}? */isolatedDynamicScopeRef(scope)::=<<    ---- isolatedDynamicScopeRef ----    scope: <scope>    ---- /isolatedDynamicScopeRef ---->>/** reference an attribute of rule; might only have single return value */ruleLabelRef(referencedRule,scope,attr)::=<<    ---- ruleLabelRef ----    referencedRule: <referenceRule>    scope: <scope>    attr: <attr>    ---- /ruleLabelRef ---->>returnAttributeRef(ruleDescriptor,attr)::=<<    ---- returnAttributeRef ----    ruleDescriptor: <ruleDescriptor>    attr: <attr>    ---- /returnAttributeRef ---->>/** How to translate $tokenLabel */tokenLabelRef(label)::= "_<label>"/** ids+=ID {$ids} or e+=expr {$e} */listLabelRef(label)::= "list_<label>"// not sure the next are the right approach; and they are evaluated early;// they cannot see TREE_PARSER or PARSER attributes for example. :(tokenLabelPropertyRef_text(scope,attr)::= "_<scope>.text"tokenLabelPropertyRef_type(scope,attr)::= "_<scope>.token_type"tokenLabelPropertyRef_line(scope,attr)::= "_<scope>.line"tokenLabelPropertyRef_pos(scope,attr) ::= "_<scope>.pos"tokenLabelPropertyRef_channel(scope,attr)::= "_<scope>.channel"tokenLabelPropertyRef_index(scope,attr)::= "_<scope>.index"tokenLabelPropertyRef_tree(scope,attr)::= "----- tokenLablePropertyRef_tree / ----"ruleLabelPropertyRef_start(scope,attr)::=<<    ---- ruleLabelPropertyRef_start ----    scope: <scope>    attr: <attr>    ---- /ruleLabelPropertyRef_start ---->>ruleLabelPropertyRef_stop(scope,attr)::=<<    ---- ruleLabelPropertyRef_stop ----    scope: <scope>    attr: <attr>    ---- /ruleLabelPropertyRef_stop ---->>ruleLabelPropertyRef_tree(scope,attr)::=<<    ---- ruleLabelPropertyRef_tree ----    scope: <scope>    attr: <attr>    ---- /ruleLabelPropertyRef_tree ---->>ruleLabelPropertyRef_text(scope,attr)::=<<    ---- ruleLabelPropertyRef_text ----    scope: <scope>    attr: <attr>    ---- /ruleLabelPropertyRef_text ---->>ruleLabelPropertyRef_st(scope,attr)::=<<    ---- ruleLabelPropertyRef_st ----    scope: <scope>    attr: <attr>    ---- /ruleLabelPropertyRef_st ---->>/** Isolated $RULE ref ok in lexer as it's a Token */lexerRuleLabel(label)::=<<    ---- lexerRuleLabel ----    label: <label>    ---- /lexerRuleLabel ---->>lexerRuleLabelPropertyRef_type(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_type ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_type ---->>lexerRuleLabelPropertyRef_line(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_line ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_line ---->>lexerRuleLabelPropertyRef_pos(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_pos ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_pos ---->>lexerRuleLabelPropertyRef_channel(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_channel ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_channel ---->>lexerRuleLabelPropertyRef_index(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_index ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_index ---->>lexerRuleLabelPropertyRef_text(scope,attr)::=<<    ---- lexerRuleLabelPropertyRef_text ----    scope: <scope>    attr: <attr>    ---- /lexerRuleLabelPropertyRef_text ---->>// Somebody may ref $template or $tree or $stop within a rule:rulePropertyRef_start(scope,attr)::=<<    ---- rulePropertyRef_start ----    scope: <scope>    attr: <attr>    ---- /rulePropertyRef_start ---->>rulePropertyRef_stop(scope,attr)::=<<    ---- rulePropertyRef_stop ----    scope: <scope>    attr: <attr>    ---- /rulePropertyRef_stop ---->>rulePropertyRef_tree(scope,attr)::=<<    ---- rulePropertyRef_tree ----    scope: <scope>    attr: <attr>    ---- /rulePropertyRef_tree ---->>rulePropertyRef_text(scope,attr)::=<<    ---- rulePropertyRef_text ----    scope: <scope>    attr: <attr>    ---- /rulePropertyRef_text ---->>rulePropertyRef_st(scope,attr)::=<<    ---- rulePropertyRef_st ----    scope: <scope>    attr: <attr>    ---- /rulePropertyRef_st ---->>/** How to execute an action *//** TODO: add syntactic predicate & bactracking gates **/execAction(action)::=<<<action>>>// M I S C (properties, etc...)codeFileExtension()::=".rb"true()::= "true"false()::= "false"///////////// --------------------------- private templates --------------------------------bitset()::=<<    ---- bitset ----    name: <it.name>    inName: <it.inName>    bits: <it.bits>    tokenIndex: <it.tokenIndex>    ---- /bitset ---->>element() ::= "<it.el>"plainBlock(decls, alts, description) ::=<<<decls><alts>>>switchBlock(description, decisionNumber, maxAlt, alts, decls, decision) ::=<<# <description>alt<decisionNumber> = <maxAlt><decls><decision>case alt<decisionNumber>    <alts:switchCase(); separator="\n">end>>switchCase() ::=<<when <i>    <it>>>LA(k) ::=<<<if(LEXER)>@input.look_ahead(<k>)<else>look_ahead(<k>)<endif>>>synpred(name) ::= <<def <name>    start = @input.mark()    @backtracking += 1    <name>_fragment()    @backtracking -= 1    success = !@failed    @input.rewind(start)    @failed = false    return successend>>parameterScope(scope) ::= <<<scope.attributes:{<it.decl>}; separator=", ">>>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -