Enhanced C#
Language of your choice: library documentation
|
Standard code generator for character/integer input streams and is the default code generator for LLParserGenerator. This is the code generator helper for LLLPG lexer {...}
.
More...
Standard code generator for character/integer input streams and is the default code generator for LLParserGenerator. This is the code generator helper for LLLPG lexer {...}
.
Public static fields | |
const int | EOF_int = PGIntSet.EOF_int |
Properties | |
LNode?? | SetType [get, set] |
override IPGTerminalSet | EmptySet [get] |
Properties inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
LNode | InputSource [get, set] |
Specifies an object or class on which LLLPG APIs such as Match() and LA() should be called. More... | |
LNode | InputClass [get, set] |
Specifies a class or namespace to use when calling static functions. There is only one currently: NewSet(), which applies only to . More... | |
LNode | TerminalType [get, set] |
The type returned from Match() methods. More... | |
LNode | ListType [get, set] |
Gets or sets the type of lists created with the +: operator (default: List<T>). The identifier "T" should appear in the expression; it will be replaced with the type of items in the list. More... | |
LNode | ListInitializer [get, set] |
Gets or sets the initializer expression for lists created with the +: operator (default: new List<T>()). The identifier "T" should appear in the expression; it will be replaced with the type of items in the list. More... | |
bool | NoCheckByDefault [get, set] |
If true, calls to Check() are suppressed when AndPred.CheckErrorMessage is null. More... | |
abstract IPGTerminalSet | EmptySet [get] |
virtual int | BaseCostForSwitch [get] |
Used to help decide whether a "switch" or an if-else chain will be used for prediction. This is the starting cost of a switch (the starting cost of an if-else chain is set to zero). More... | |
Properties inherited from Loyc.LLParserGenerator.IPGCodeGenHelper | |
IPGTerminalSet | EmptySet [get] |
Returns an empty set of the appropriate type for the kind of parser being generated by this code. More... | |
LNode | TerminalType [get] |
Type of variables auto-declared when you use labels in your grammar (e.g. x:Foo (list+:Bar)*) More... | |
Public Member Functions | |
override Pred | CodeToTerminalPred (LNode expr, ref string errorMsg) |
Creates a terminal predicate from a code expression. More... | |
override IPGTerminalSet | Optimize (IPGTerminalSet set, IPGTerminalSet dontcare) |
Simplifies the specified set, if possible, so that GenerateTest() can generate simpler code for an if-else chain in a prediction tree. More... | |
int? | ExampleInt (PGIntSet set) |
override? char | ExampleChar (IPGTerminalSet set_) |
Returns an example of a character in the set, or null if this is not a set of characters or if EOF is the only member of the set. More... | |
override string | Example (IPGTerminalSet set_) |
Returns an example of an item in the set. If the example is a character, it should be surrounded by single quotes. More... | |
override LNode | GenerateMatchExpr (IPGTerminalSet set_, bool savingResult, bool recognizerMode) |
Generate code to match a set, e.g. MatchRange('a', 'z'); or MatchExcept(' . If the set is too complex, a declaration for it is created in classBody. More... | |
override LNode | LAType () |
Returns the data type of LA(k) More... | |
Public Member Functions inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
void | SetListInitializer (LNode varDecl) |
Sets ListType and/or ListInitializer based on an expression. A statement like Type x = expr sets ListType = Type and ListInitializer = expr ; A statement like Type x just sets ListType = Type ; and any other expression expr sets ListInitializer = expr . More... | |
LNode | ResolveAlias (LNode expr) |
Returns the node for an alias. If the specified node is not an alias, returns the same node unchanged. More... | |
virtual LNode | VisitInput (LNode stmt, IMessageSink sink) |
In case the IPGCodeGenHelper is interested, the LLLPG macro calls this method on each statement in the body of the macro (as a preprocessing step, before LLLPG looks at it). No action is required. More... | |
virtual void | Begin (WList< LNode > classBody, ISourceFile sourceFile) |
Before the parser generator generates code, it calls this method. More... | |
virtual void | BeginRule (Rule rule) |
Notifies the snippet generator that code generation is starting for a new rule. More... | |
virtual void | Done () |
LLParserGenerator calls this method to notify the snippet generator that code generation is complete. More... | |
virtual LNode | GenerateTest (IPGTerminalSet set, LNode laVar) |
Generates code to test whether the terminal denoted 'laVar' is in the set. More... | |
virtual LNode | GenerateSkip (bool savingResult) |
Returns (Skip()) , or (MatchAny()) if the result is to be saved. More... | |
virtual LNode | GenerateAndPredCheck (AndPred andPred, LNode code, int li) |
Generate code to check an and-predicate during or after prediction, e.g. &!{foo} becomes !(foo) during prediction and Check(!(foo)); afterward. More... | |
virtual LNode | GenerateMatch (IPGTerminalSet set, bool savingResult, bool recognizerMode) |
Generate code to match a set, e.g. MatchRange('a', 'z'); or MatchExcept(' . If the set is too complex, a declaration for it is created in the classBody which was passed to Begin() . More... | |
virtual LNode | LA (int k) |
Generates code to read LA(k). More... | |
virtual LNode | ErrorBranch (IPGTerminalSet covered, int laIndex) |
Generates code for the default error branch of prediction (called when there is no explicit error branch). More... | |
virtual bool | ShouldGenerateSwitch (IPGTerminalSet[] sets, MSet< int > casesToInclude, bool hasErrorBranch) |
Decides whether to use a switch() and for which cases, using BaseCostForSwitch and GetRelativeCostForSwitch. More... | |
virtual LNode | GenerateSwitch (IPGTerminalSet[] branchSets, LNode[] branchCode, MSet< int > casesToInclude, LNode defaultBranch, LNode laVar) |
Generates a switch statement with the specified branches where branchCode[i] is the code to run if the input is in the set branchSets[i]. More... | |
virtual LNode | CreateRuleMethod (Rule rule, LNodeList methodBody) |
Generates the method for a rule, given the method's contents. More... | |
LNode | CreateTryWrapperForRecognizer (Rule rule) |
See IPGCodeGenHelper.CreateTryWrapperForRecognizer for more information. More... | |
virtual LNode | CallRule (RuleRef rref, bool recognizerMode) |
Generates code to call a rule based on rref.Rule.Name and rref.Params . More... | |
virtual LNode | CallTryRecognizer (RuleRef rref, int lookahead) |
Generates a call to the Try_Scan_*() function that wraps around a Scan_*() recognizer. Called while generating code for an and-pred. More... | |
virtual LNode | GetListType (LNode type) |
Gets the list type for elements of the specified type (e.g. List<type>) More... | |
virtual LNode | MakeInitializedVarDecl (LNode type, bool wantList, Symbol varName) |
Gets a variable declaration for the specified type, e.g. if type is Foo and wantList == true and varName.Name == "x" , the statement returned might be List<Foo> x = new List<Foo>(); More... | |
Public Member Functions inherited from Loyc.LLParserGenerator.IPGCodeGenHelper |
Protected Member Functions | |
override LNode | GenerateTest (IPGTerminalSet set, LNode subject, Symbol setName) |
Generates code to test whether a terminal is in the set. More... | |
override LNode | GenerateSetDecl (IPGTerminalSet set, Symbol setName) |
Generates a declaration for a variable that holds the set. More... | |
LNode | GenerateSetDecl (PGIntSet set, Symbol setName) |
override int | GetRelativeCostForSwitch (IPGTerminalSet set) |
Used to help decide whether a "switch" or an if statement will be used to handle a prediction tree, and if so which branches. This method should calculate the "cost of switch" (which generally represents a code size penalty, as there is a separate case for every element of the set) and the "cost of if" (which generally represents a speed penalty) and return the difference (so that positive numbers favor "switch" and negative numbers favor "if".) More... | |
override IEnumerable< LNode > | GetCases (IPGTerminalSet set) |
Gets the literals or symbols to use for switch cases of a set (just the values, not including the case labels.) More... | |
Protected Member Functions inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
virtual Symbol | GenerateSetName (Rule currentRule) |
virtual Symbol | GenerateSetDecl (IPGTerminalSet set) |
virtual LNode | ApiCall (Symbol apiName, params LNode[] args) |
Returns an LNode representing a call to the specified LLLPG API. For example, if the user used a "inputSource=input" option, then ApiCall(_Match, F.Literal('7')) would generate a node that represents input.Match('7') . More... | |
virtual LNode | ApiCall (Symbol apiName, IEnumerable< LNode > args, bool isStatic=false) |
Returns an LNode representing a call to the specified LLLPG API. For example, if the user used a "inputSource=input" option, then ApiCall(_Match, F.Literal('7')) would generate a node that represents input.Match('7') . More... | |
virtual LNode | ApiType (LNode typeName) |
virtual LNode | DefaultOf (LNode type, bool wantList) |
Additional Inherited Members | |
Static Protected Member Functions inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
static bool | EndMayBeReachable (LNode stmt) |
Protected fields inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
int | _setNameCounter = 0 |
LNodeFactory | F |
WList< LNode > | _classBody |
Rule | _currentRule |
Dictionary< LNode, LNode > | _definedAliases = new Dictionary<LNode, LNode>() |
Protected static fields inherited from Loyc.LLParserGenerator.CodeGenHelperBase | |
static readonly Symbol | _Skip = GSymbol.Get("Skip") |
static readonly Symbol | _MatchAny = GSymbol.Get("MatchAny") |
static readonly Symbol | _Match = GSymbol.Get("Match") |
static readonly Symbol | _MatchExcept = GSymbol.Get("MatchExcept") |
static readonly Symbol | _MatchRange = GSymbol.Get("MatchRange") |
static readonly Symbol | _MatchExceptRange = GSymbol.Get("MatchExceptRange") |
static readonly Symbol | _TryMatch = GSymbol.Get("TryMatch") |
static readonly Symbol | _TryMatchExcept = GSymbol.Get("TryMatchExcept") |
static readonly Symbol | _TryMatchRange = GSymbol.Get("TryMatchRange") |
static readonly Symbol | _TryMatchExceptRange = GSymbol.Get("TryMatchExceptRange") |
static readonly Symbol | _LA = GSymbol.Get("LA") |
static readonly Symbol | _LA0 = GSymbol.Get("LA0") |
static readonly Symbol | _Check = GSymbol.Get("Check") |
static readonly Symbol | _Error = GSymbol.Get("Error") |
static readonly Symbol | _underscore = GSymbol.Get("_") |
static readonly Symbol | _alias = GSymbol.Get("alias") |
static readonly Symbol | _T = GSymbol.Get("T") |
|
inlinevirtual |
Creates a terminal predicate from a code expression.
expr | A expression provided by the user, such as "a string" , a Token.Type , or a value..range . expr will not be a call to the inversion operator #~ (that's handled internally using IPGTerminalSet.Inverted()). This method also handles the "any token" input, which is an underscore by convention (_). |
errorMsg | An error message to display. If the method returns null, the LLLPG macro shows this as an error; if this method does not return null, the message (if provided) is shown as a warning. |
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
References Loyc.Syntax.LNode.Args, Loyc.Syntax.LNode.Calls(), Loyc.LLParserGenerator.IntSet.IsCharSet, and Loyc.Syntax.LNode.Value.
|
inlinevirtual |
Returns an example of an item in the set. If the example is a character, it should be surrounded by single quotes.
This helps produce error messages in LLLPG.
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
References Loyc.LLParserGenerator.IntStreamCodeGenHelper.ExampleChar().
|
inlinevirtual |
Returns an example of a character in the set, or null if this is not a set of characters or if EOF is the only member of the set.
This helps produce error messages in LLLPG.
Reimplemented from Loyc.LLParserGenerator.CodeGenHelperBase.
Referenced by Loyc.LLParserGenerator.IntStreamCodeGenHelper.Example().
|
inlinevirtual |
Generate code to match a set, e.g. MatchRange('a', 'z');
or MatchExcept('
. If the set is too complex, a declaration for it is created in classBody.
', '\r'); }
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
References Loyc.LLParserGenerator.CodeGenHelperBase.ApiCall(), and Loyc.LLParserGenerator.IntStreamCodeGenHelper.GenerateSetDecl().
|
inlineprotectedvirtual |
Generates a declaration for a variable that holds the set.
For example, if setName is foo, a set such as [aeiouy] might use an external declaration such as
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
Referenced by Loyc.LLParserGenerator.IntStreamCodeGenHelper.GenerateMatchExpr().
|
inlineprotectedvirtual |
Generates code to test whether a terminal is in the set.
subject | Represents the variable to be tested. |
setName | Names an external set variable to use for the test. |
(la0 >= '0' && '9' >= la0)
, or null if an external setName is needed and was not provided.At first, LLParserGenerator calls this method with setName == null
. If it returns null, it calls the method a second time, giving the name of an external variable in which the set is held (see GenerateSetDecl(IPGTerminalSet)).
For example, if the subject is @la0, the test for a simple set like [a-z?] might be something like (la0 >= 'a' && 'z' >= la0) || la0 == '?'
. When the setName is foo
, the test might be foo.Contains(la0)
instead.
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
|
inlineprotectedvirtual |
Gets the literals or symbols to use for switch cases of a set (just the values, not including the case labels.)
Reimplemented from Loyc.LLParserGenerator.CodeGenHelperBase.
|
inlineprotectedvirtual |
Used to help decide whether a "switch" or an if statement will be used to handle a prediction tree, and if so which branches. This method should calculate the "cost of switch" (which generally represents a code size penalty, as there is a separate case for every element of the set) and the "cost of if" (which generally represents a speed penalty) and return the difference (so that positive numbers favor "switch" and negative numbers favor "if".)
If the set is inverted, return a something like -1000000 to ensure 'switch' is not used for that set.
Reimplemented from Loyc.LLParserGenerator.CodeGenHelperBase.
|
inlinevirtual |
Returns the data type of LA(k)
Implements Loyc.LLParserGenerator.CodeGenHelperBase.
|
inlinevirtual |
Simplifies the specified set, if possible, so that GenerateTest() can generate simpler code for an if-else chain in a prediction tree.
set | |
dontcare | A set of terminals that have been ruled out, i.e. it is already known that the lookahead value is not in this set. |
Reimplemented from Loyc.LLParserGenerator.CodeGenHelperBase.