Class AssemblyParser
- java.lang.Object
-
- ghidra.app.plugin.assembler.sleigh.parse.AssemblyParser
-
public class AssemblyParser extends java.lang.Object
A class to encapsulate LALR(1) parsing for a given grammar This class constructs the Action/Goto table (and all the other trappings) of a LALR(1) parser and provides aparse(String)
method to parse actual sentences. This implementation is somewhat unconventional in that it permits ambiguous grammars. Instead of complaining, it produces the set of all possible parse trees. Of course, this comes at the cost of some efficiency. See Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman, Compilers: Principles, Techniques, & Tools. Bostom, MA: Pearson, 2007. See Jackson, Stephen. LALR(1) Parsing. Halifax, Nova Scotia, Canada: Dalhousie University. <http://web.cs.dal.ca/~sjackson/lalr1.html>
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected static class
AssemblyParser.MergeKey
A map key used to identify merges for Step 4 in Stephen Jackson's rantprotected static class
AssemblyParser.MergeValue
The map value keyed byAssemblyParser.MergeKey
-
Field Summary
Fields Modifier and Type Field Description protected AssemblyParseActionGotoTable
actions
protected static DbgTimer
dbg
protected static boolean
dbg_detail
static java.util.Map<java.lang.String,java.lang.Long>
EMPTY_LABELS
A convenience to specify no labels inparse(String, Map)
protected AssemblyExtendedGrammar
extendedGrammar
protected AssemblyFirstFollow
extff
protected AssemblyFirstFollow
ff
protected AssemblyGrammar
grammar
protected java.util.Map<AssemblyParser.MergeKey,AssemblyParser.MergeValue>
mergers
protected java.util.ArrayList<AssemblyParseState>
states
protected AssemblyParseTransitionTable
table
-
Constructor Summary
Constructors Constructor Description AssemblyParser(AssemblyGrammar grammar)
Construct a LALR(1) parser from the given grammar
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected int
addLR0State(AssemblyParseState state)
Add a newly-constructed LR0 state, and return it's assigned numberprotected void
buildActionGotoTable()
protected void
buildExtendedGrammar()
protected void
buildLR0Machine()
protected AssemblyExtendedProduction
extend(AssemblyProduction prod, int start)
Extend a production, using the given LR0 start stateAssemblyGrammar
getGrammar()
Get the grammar used to construct this parserjava.lang.Iterable<AssemblyParseResult>
parse(java.lang.String input)
Parse the given sentencejava.util.Collection<AssemblyParseResult>
parse(java.lang.String input, java.util.Map<java.lang.String,java.lang.Long> labels)
Parse the given sentence with the given defined labelsvoid
printExtendedFF(java.io.PrintStream out)
For debuggingvoid
printExtendedGrammar(java.io.PrintStream out)
For debuggingvoid
printGeneralFF(java.io.PrintStream out)
For debuggingvoid
printGrammar(java.io.PrintStream out)
For debuggingvoid
printLR0States(java.io.PrintStream out)
For debuggingvoid
printLR0TransitionTable(java.io.PrintStream out)
For debuggingvoid
printMergers(java.io.PrintStream out)
For debuggingvoid
printParseTable(java.io.PrintStream out)
For debuggingvoid
printStuff(java.io.PrintStream out)
For debugging
-
-
-
Field Detail
-
grammar
protected final AssemblyGrammar grammar
-
ff
protected final AssemblyFirstFollow ff
-
states
protected final java.util.ArrayList<AssemblyParseState> states
-
table
protected final AssemblyParseTransitionTable table
-
extendedGrammar
protected AssemblyExtendedGrammar extendedGrammar
-
extff
protected final AssemblyFirstFollow extff
-
mergers
protected java.util.Map<AssemblyParser.MergeKey,AssemblyParser.MergeValue> mergers
-
actions
protected AssemblyParseActionGotoTable actions
-
EMPTY_LABELS
public static final java.util.Map<java.lang.String,java.lang.Long> EMPTY_LABELS
A convenience to specify no labels inparse(String, Map)
-
dbg
protected static final DbgTimer dbg
-
dbg_detail
protected static final boolean dbg_detail
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
AssemblyParser
public AssemblyParser(AssemblyGrammar grammar)
Construct a LALR(1) parser from the given grammar- Parameters:
grammar
- the grammar
-
-
Method Detail
-
buildLR0Machine
protected void buildLR0Machine()
-
addLR0State
protected int addLR0State(AssemblyParseState state)
Add a newly-constructed LR0 state, and return it's assigned number- Parameters:
state
- the newly-constructed state- Returns:
- the assigned number If the state already exists, this just returns its previously assigned number
-
buildExtendedGrammar
protected void buildExtendedGrammar()
-
extend
protected AssemblyExtendedProduction extend(AssemblyProduction prod, int start)
Extend a production, using the given LR0 start state- Parameters:
prod
- the production to extendstart
- the starting LR0 state- Returns:
- the extended production, if the start state is valid for it
-
buildActionGotoTable
protected void buildActionGotoTable()
-
parse
public java.lang.Iterable<AssemblyParseResult> parse(java.lang.String input)
Parse the given sentence- Parameters:
input
- the sentence to parse- Returns:
- all possible parse trees (and possible errors)
-
parse
public java.util.Collection<AssemblyParseResult> parse(java.lang.String input, java.util.Map<java.lang.String,java.lang.Long> labels)
Parse the given sentence with the given defined labels- Parameters:
input
- the sentence to parserlabels
- a map of label to number substitutions- Returns:
- all possible parse results (trees and errors)
The tokenizer for numeric terminals also accepts any key in
labels.
In such cases, the resulting token is assigned the value of the label.
-
printGrammar
public void printGrammar(java.io.PrintStream out)
For debugging
-
printLR0States
public void printLR0States(java.io.PrintStream out)
For debugging
-
printLR0TransitionTable
public void printLR0TransitionTable(java.io.PrintStream out)
For debugging
-
printExtendedGrammar
public void printExtendedGrammar(java.io.PrintStream out)
For debugging
-
printGeneralFF
public void printGeneralFF(java.io.PrintStream out)
For debugging
-
printExtendedFF
public void printExtendedFF(java.io.PrintStream out)
For debugging
-
printMergers
public void printMergers(java.io.PrintStream out)
For debugging
-
printParseTable
public void printParseTable(java.io.PrintStream out)
For debugging
-
printStuff
public void printStuff(java.io.PrintStream out)
For debugging
-
getGrammar
public AssemblyGrammar getGrammar()
Get the grammar used to construct this parser- Returns:
- the grammar
-
-