aboutsummaryrefslogtreecommitdiff
path: root/driver/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-08-05 20:01:51 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-08-05 20:56:01 +0900
commit7b4ed6608ea338c77e89b06bb20efae15491fcbc (patch)
treef4d3d2f5e5e49f56d86aa9b0f0ba77832d2f8217 /driver/parser.go
parentAvoid the growth of slices when constructing trees (diff)
downloadurubu-7b4ed6608ea338c77e89b06bb20efae15491fcbc.tar.gz
urubu-7b4ed6608ea338c77e89b06bb20efae15491fcbc.tar.xz
Add --only-parse option to the parse command
When this option is enabled, the parser performs only parse and doesn't semantic actions.
Diffstat (limited to 'driver/parser.go')
-rw-r--r--driver/parser.go17
1 files changed, 11 insertions, 6 deletions
diff --git a/driver/parser.go b/driver/parser.go
index cdcaf14..a96f89a 100644
--- a/driver/parser.go
+++ b/driver/parser.go
@@ -81,6 +81,7 @@ type Parser struct {
ast *Node
makeAST bool
makeCST bool
+ needSemAct bool
}
func NewParser(gram *spec.CompiledGrammar, src io.Reader, opts ...ParserOption) (*Parser, error) {
@@ -93,7 +94,6 @@ func NewParser(gram *spec.CompiledGrammar, src io.Reader, opts ...ParserOption)
gram: gram,
lex: lex,
stateStack: []int{},
- semStack: []*semanticFrame{},
}
for _, opt := range opts {
@@ -103,6 +103,8 @@ func NewParser(gram *spec.CompiledGrammar, src io.Reader, opts ...ParserOption)
}
}
+ p.needSemAct = p.makeAST || p.makeCST
+
return p, nil
}
@@ -130,7 +132,7 @@ func (p *Parser) Parse() error {
}
// semantic action
- {
+ if p.needSemAct {
var ast *Node
var cst *Node
if p.makeAST {
@@ -154,14 +156,17 @@ func (p *Parser) Parse() error {
case act > 0: // Reduce
accepted := p.reduce(act)
if accepted {
- top := p.semStack[len(p.semStack)-1]
- p.cst = top.cst
- p.ast = top.ast
+ if p.needSemAct {
+ top := p.semStack[len(p.semStack)-1]
+ p.cst = top.cst
+ p.ast = top.ast
+ }
+
return nil
}
// semantic action
- {
+ if p.needSemAct {
prodNum := act
lhs := p.gram.ParsingTable.LHSSymbols[prodNum]