1104 lines
27 KiB
Go
Executable File
1104 lines
27 KiB
Go
Executable File
|
|
package parser
|
|
|
|
import "github.com/localhots/penny/ast"
|
|
|
|
type (
|
|
//TODO: change type and variable names to be consistent with other tables
|
|
ProdTab [numProductions]ProdTabEntry
|
|
ProdTabEntry struct {
|
|
String string
|
|
Id string
|
|
NTType int
|
|
Index int
|
|
NumSymbols int
|
|
ReduceFunc func([]Attrib) (Attrib, error)
|
|
}
|
|
Attrib interface {
|
|
}
|
|
)
|
|
|
|
var productionsTable = ProdTab {
|
|
ProdTabEntry{
|
|
String: `S' : Word << >>`,
|
|
Id: "S'",
|
|
NTType: 0,
|
|
Index: 0,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Word : word << ast.NewWord(X[0]) >>`,
|
|
Id: "Word",
|
|
NTType: 1,
|
|
Index: 1,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewWord(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoNumber : number << ast.NewIoNumber(X[0]) >>`,
|
|
Id: "IoNumber",
|
|
NTType: 2,
|
|
Index: 2,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoNumber(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `AssignmentWord : Word "=" Word << ast.NewAssignment(X[0], X[2]) >>`,
|
|
Id: "AssignmentWord",
|
|
NTType: 3,
|
|
Index: 3,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewAssignment(X[0], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `List : List SeparatorOp AndOr << ast.AppendToList(X[0], X[2]) >>`,
|
|
Id: "List",
|
|
NTType: 4,
|
|
Index: 4,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToList(X[0], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `List : AndOr << ast.NewList(X[0]) >>`,
|
|
Id: "List",
|
|
NTType: 4,
|
|
Index: 5,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewList(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `AndOr : Pipeline << ast.NewAndOr(X[0]) >>`,
|
|
Id: "AndOr",
|
|
NTType: 5,
|
|
Index: 6,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewAndOr(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `AndOr : AndOr "&&" Linebreak Pipeline << ast.AppendAnd(X[0], X[3]) >>`,
|
|
Id: "AndOr",
|
|
NTType: 5,
|
|
Index: 7,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendAnd(X[0], X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `AndOr : AndOr "||" Linebreak Pipeline << ast.AppendOr(X[0], X[3]) >>`,
|
|
Id: "AndOr",
|
|
NTType: 5,
|
|
Index: 8,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendOr(X[0], X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Pipeline : PipeSequence << ast.NewPipeline(X[1], false) >>`,
|
|
Id: "Pipeline",
|
|
NTType: 6,
|
|
Index: 9,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewPipeline(X[1], false)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Pipeline : "!" PipeSequence << ast.NewPipeline(X[1], true) >>`,
|
|
Id: "Pipeline",
|
|
NTType: 6,
|
|
Index: 10,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewPipeline(X[1], true)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `PipeSequence : Command << ast.NewPipeSequence(X[0]) >>`,
|
|
Id: "PipeSequence",
|
|
NTType: 7,
|
|
Index: 11,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewPipeSequence(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `PipeSequence : PipeSequence "|" Linebreak Command << ast.AppendToPipeSequence(X[0], X[3]) >>`,
|
|
Id: "PipeSequence",
|
|
NTType: 7,
|
|
Index: 12,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToPipeSequence(X[0], X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Command : SimpleCommand << ast.NewCommand(X[0], nil) >>`,
|
|
Id: "Command",
|
|
NTType: 8,
|
|
Index: 13,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCommand(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Command : CompoundCommand << ast.NewCommand(X[0], nil) >>`,
|
|
Id: "Command",
|
|
NTType: 8,
|
|
Index: 14,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCommand(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Command : CompoundCommand RedirectList << ast.NewCommand(X[0], X[1]) >>`,
|
|
Id: "Command",
|
|
NTType: 8,
|
|
Index: 15,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCommand(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Command : FunctionDefinition << ast.NewCommand(X[0], nil) >>`,
|
|
Id: "Command",
|
|
NTType: 8,
|
|
Index: 16,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCommand(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : BraceGroup << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 17,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : Subshell << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 18,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : ForClause << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 19,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : CaseClause << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 20,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : IfClause << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 21,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : WhileClause << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 22,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundCommand : UntilClause << ast.NewCompoundCommand(X[0]) >>`,
|
|
Id: "CompoundCommand",
|
|
NTType: 9,
|
|
Index: 23,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundCommand(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Subshell : "(" CompoundList ")" << ast.NewSubshell(X[1]) >>`,
|
|
Id: "Subshell",
|
|
NTType: 10,
|
|
Index: 24,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSubshell(X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundList : Term << ast.NewCompoundList(X[0], nil) >>`,
|
|
Id: "CompoundList",
|
|
NTType: 11,
|
|
Index: 25,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundList(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundList : NewlineList Term << ast.NewCompoundList(X[1], X[2]) >>`,
|
|
Id: "CompoundList",
|
|
NTType: 11,
|
|
Index: 26,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundList(X[1], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundList : Term Separator << ast.NewCompoundList(X[0], X[1]) >>`,
|
|
Id: "CompoundList",
|
|
NTType: 11,
|
|
Index: 27,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundList(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CompoundList : NewlineList Term Separator << ast.NewCompoundList(X[1], X[2]) >>`,
|
|
Id: "CompoundList",
|
|
NTType: 11,
|
|
Index: 28,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCompoundList(X[1], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Term : Term Separator AndOr << ast.AppendToTerm(X[0], X[2], X[1]) >>`,
|
|
Id: "Term",
|
|
NTType: 12,
|
|
Index: 29,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToTerm(X[0], X[2], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Term : AndOr << ast.NewTerm(X[0]) >>`,
|
|
Id: "Term",
|
|
NTType: 12,
|
|
Index: 30,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewTerm(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `ForClause : "for" Name Linebreak DoGroup << ast.NewForClause(X[1], ast.Wordlist{}, X[3]) >>`,
|
|
Id: "ForClause",
|
|
NTType: 13,
|
|
Index: 31,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewForClause(X[1], ast.Wordlist{}, X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `ForClause : "for" Name Linebreak "in" SequentialSep DoGroup << ast.NewForClause(X[1], ast.Wordlist{}, X[5]) >>`,
|
|
Id: "ForClause",
|
|
NTType: 13,
|
|
Index: 32,
|
|
NumSymbols: 6,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewForClause(X[1], ast.Wordlist{}, X[5])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `ForClause : "for" Name Linebreak "in" Wordlist SequentialSep DoGroup << ast.NewForClause(X[1], X[4], X[6]) >>`,
|
|
Id: "ForClause",
|
|
NTType: 13,
|
|
Index: 33,
|
|
NumSymbols: 7,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewForClause(X[1], X[4], X[6])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Name : name << ast.NewName(X[0]) >>`,
|
|
Id: "Name",
|
|
NTType: 14,
|
|
Index: 34,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewName(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Wordlist : Wordlist Word << ast.AppendToWordlist(X[0], X[1]) >>`,
|
|
Id: "Wordlist",
|
|
NTType: 15,
|
|
Index: 35,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToWordlist(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Wordlist : Word << ast.NewWordlist(X[0]) >>`,
|
|
Id: "Wordlist",
|
|
NTType: 15,
|
|
Index: 36,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewWordlist(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseClause : "case" Word Linebreak "in" Linebreak CaseList "esac" << ast.NewCaseClause(X[1], X[5]) >>`,
|
|
Id: "CaseClause",
|
|
NTType: 16,
|
|
Index: 37,
|
|
NumSymbols: 7,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseClause(X[1], X[5])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseClause : "case" Word Linebreak "in" Linebreak CaseListNs "esac" << ast.NewCaseClause(X[1], X[5]) >>`,
|
|
Id: "CaseClause",
|
|
NTType: 16,
|
|
Index: 38,
|
|
NumSymbols: 7,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseClause(X[1], X[5])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseClause : "case" Word Linebreak "in" Linebreak "esac" << ast.NewCaseClause(X[1], ast.CaseList{}) >>`,
|
|
Id: "CaseClause",
|
|
NTType: 16,
|
|
Index: 39,
|
|
NumSymbols: 6,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseClause(X[1], ast.CaseList{})
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseListNs : CaseList CaseItemNs << ast.AppendToCaseList(X[0], X[1]) >>`,
|
|
Id: "CaseListNs",
|
|
NTType: 17,
|
|
Index: 40,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToCaseList(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseListNs : CaseItemNs << ast.NewCaseList(X[0]) >>`,
|
|
Id: "CaseListNs",
|
|
NTType: 17,
|
|
Index: 41,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseList(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseList : CaseList CaseItem << ast.AppendToCaseList(X[0], X[1]) >>`,
|
|
Id: "CaseList",
|
|
NTType: 18,
|
|
Index: 42,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToCaseList(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseList : CaseItem << ast.NewCaseList(X[0]) >>`,
|
|
Id: "CaseList",
|
|
NTType: 18,
|
|
Index: 43,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseList(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItemNs : Pattern ")" Linebreak << ast.NewCaseItem(X[0], nil) >>`,
|
|
Id: "CaseItemNs",
|
|
NTType: 19,
|
|
Index: 44,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItemNs : Pattern ")" CompoundList Linebreak << ast.NewCaseItem(X[0], X[2]) >>`,
|
|
Id: "CaseItemNs",
|
|
NTType: 19,
|
|
Index: 45,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[0], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItemNs : "(" Pattern ")" Linebreak << ast.NewCaseItem(X[1], nil) >>`,
|
|
Id: "CaseItemNs",
|
|
NTType: 19,
|
|
Index: 46,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[1], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItemNs : "(" Pattern ")" CompoundList Linebreak << ast.NewCaseItem(X[1], X[3]) >>`,
|
|
Id: "CaseItemNs",
|
|
NTType: 19,
|
|
Index: 47,
|
|
NumSymbols: 5,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[1], X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItem : Pattern ")" Linebreak ";;" Linebreak << ast.NewCaseItem(X[0], nil) >>`,
|
|
Id: "CaseItem",
|
|
NTType: 20,
|
|
Index: 48,
|
|
NumSymbols: 5,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItem : Pattern ")" CompoundList ";;" Linebreak << ast.NewCaseItem(X[0], X[2]) >>`,
|
|
Id: "CaseItem",
|
|
NTType: 20,
|
|
Index: 49,
|
|
NumSymbols: 5,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[0], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItem : "(" Pattern ")" Linebreak ";;" Linebreak << ast.NewCaseItem(X[1], nil) >>`,
|
|
Id: "CaseItem",
|
|
NTType: 20,
|
|
Index: 50,
|
|
NumSymbols: 6,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[1], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CaseItem : "(" Pattern ")" CompoundList ";;" Linebreak << ast.NewCaseItem(X[1], X[3]) >>`,
|
|
Id: "CaseItem",
|
|
NTType: 20,
|
|
Index: 51,
|
|
NumSymbols: 6,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCaseItem(X[1], X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Pattern : Word << ast.NewPattern(X[0]) >>`,
|
|
Id: "Pattern",
|
|
NTType: 21,
|
|
Index: 52,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewPattern(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Pattern : Pattern "|" Word << ast.AppendToPattern(X[0], X[2]) >>`,
|
|
Id: "Pattern",
|
|
NTType: 21,
|
|
Index: 53,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToPattern(X[0], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IfClause : "if" CompoundList "then" CompoundList ElsePart "fi" << ast.NewIfClause(X[1], X[3], X[4]) >>`,
|
|
Id: "IfClause",
|
|
NTType: 22,
|
|
Index: 54,
|
|
NumSymbols: 6,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIfClause(X[1], X[3], X[4])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IfClause : "if" CompoundList "then" CompoundList "fi" << ast.NewIfClause(X[1], X[3], nil) >>`,
|
|
Id: "IfClause",
|
|
NTType: 22,
|
|
Index: 55,
|
|
NumSymbols: 5,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIfClause(X[1], X[3], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `ElsePart : "elif" CompoundList "then" ElsePart << ast.NewIfClause(X[1], nil, X[3]) >>`,
|
|
Id: "ElsePart",
|
|
NTType: 23,
|
|
Index: 56,
|
|
NumSymbols: 4,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIfClause(X[1], nil, X[3])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `ElsePart : "else" CompoundList << ast.NewIfClause(nil, X[1], nil) >>`,
|
|
Id: "ElsePart",
|
|
NTType: 23,
|
|
Index: 57,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIfClause(nil, X[1], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `WhileClause : "while" CompoundList DoGroup << ast.NewWhileClause(X[1], X[2]) >>`,
|
|
Id: "WhileClause",
|
|
NTType: 24,
|
|
Index: 58,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewWhileClause(X[1], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `UntilClause : "until" CompoundList DoGroup << ast.NewUntilClause(X[1], X[2]) >>`,
|
|
Id: "UntilClause",
|
|
NTType: 25,
|
|
Index: 59,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewUntilClause(X[1], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `FunctionDefinition : FunctionName "(" ")" Linebreak FunctionBody << ast.NewFunctionDefinition(X[0], X[4]) >>`,
|
|
Id: "FunctionDefinition",
|
|
NTType: 26,
|
|
Index: 60,
|
|
NumSymbols: 5,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewFunctionDefinition(X[0], X[4])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `FunctionBody : CompoundCommand << ast.NewFunctionBody(X[0], ast.RedirectList{}) >>`,
|
|
Id: "FunctionBody",
|
|
NTType: 27,
|
|
Index: 61,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewFunctionBody(X[0], ast.RedirectList{})
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `FunctionBody : CompoundCommand RedirectList << ast.NewFunctionBody(X[0], X[1]) >>`,
|
|
Id: "FunctionBody",
|
|
NTType: 27,
|
|
Index: 62,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewFunctionBody(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `FunctionName : Word << ast.NewFunctionName(X[0]) >>`,
|
|
Id: "FunctionName",
|
|
NTType: 28,
|
|
Index: 63,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewFunctionName(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `BraceGroup : "{" CompoundList "}" << ast.NewBraceGroup(X[1]) >>`,
|
|
Id: "BraceGroup",
|
|
NTType: 29,
|
|
Index: 64,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewBraceGroup(X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `DoGroup : "do" CompoundList "done" << ast.NewDoGroup(X[1]) >>`,
|
|
Id: "DoGroup",
|
|
NTType: 30,
|
|
Index: 65,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewDoGroup(X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SimpleCommand : CmdPrefix CmdWord CmdSuffix << ast.NewSimpleCommand(X[0], nil, X[1], X[2]) >>`,
|
|
Id: "SimpleCommand",
|
|
NTType: 31,
|
|
Index: 66,
|
|
NumSymbols: 3,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSimpleCommand(X[0], nil, X[1], X[2])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SimpleCommand : CmdPrefix CmdWord << ast.NewSimpleCommand(X[0], nil, X[1], nil) >>`,
|
|
Id: "SimpleCommand",
|
|
NTType: 31,
|
|
Index: 67,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSimpleCommand(X[0], nil, X[1], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SimpleCommand : CmdPrefix << ast.NewSimpleCommand(X[0], nil, nil, nil) >>`,
|
|
Id: "SimpleCommand",
|
|
NTType: 31,
|
|
Index: 68,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSimpleCommand(X[0], nil, nil, nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SimpleCommand : CmdName CmdSuffix << ast.NewSimpleCommand(nil, X[0], nil, X[1]) >>`,
|
|
Id: "SimpleCommand",
|
|
NTType: 31,
|
|
Index: 69,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSimpleCommand(nil, X[0], nil, X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SimpleCommand : CmdName << ast.NewSimpleCommand(nil, X[0], nil, nil) >>`,
|
|
Id: "SimpleCommand",
|
|
NTType: 31,
|
|
Index: 70,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSimpleCommand(nil, X[0], nil, nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdName : Word << ast.NewCmdName(X[0]) >>`,
|
|
Id: "CmdName",
|
|
NTType: 32,
|
|
Index: 71,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdName(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdWord : Word << ast.NewCmdWord(X[0]) >>`,
|
|
Id: "CmdWord",
|
|
NTType: 33,
|
|
Index: 72,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdWord(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdPrefix : IoRedirect << ast.NewCmdPrefix(nil, X[0], nil) >>`,
|
|
Id: "CmdPrefix",
|
|
NTType: 34,
|
|
Index: 73,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdPrefix(nil, X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdPrefix : CmdPrefix IoRedirect << ast.NewCmdPrefix(nil, X[1], X[0]) >>`,
|
|
Id: "CmdPrefix",
|
|
NTType: 34,
|
|
Index: 74,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdPrefix(nil, X[1], X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdPrefix : AssignmentWord << ast.NewCmdPrefix(X[0], nil, nil) >>`,
|
|
Id: "CmdPrefix",
|
|
NTType: 34,
|
|
Index: 75,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdPrefix(X[0], nil, nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdPrefix : CmdPrefix AssignmentWord << ast.NewCmdPrefix(X[1], nil, X[0]) >>`,
|
|
Id: "CmdPrefix",
|
|
NTType: 34,
|
|
Index: 76,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdPrefix(X[1], nil, X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdSuffix : IoRedirect << ast.NewCmdSuffix(ast.Word(""), X[0], nil) >>`,
|
|
Id: "CmdSuffix",
|
|
NTType: 35,
|
|
Index: 77,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdSuffix(ast.Word(""), X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdSuffix : CmdSuffix IoRedirect << ast.NewCmdSuffix(ast.Word(""), X[1], X[0]) >>`,
|
|
Id: "CmdSuffix",
|
|
NTType: 35,
|
|
Index: 78,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdSuffix(ast.Word(""), X[1], X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdSuffix : Word << ast.NewCmdSuffix(X[0], nil, nil) >>`,
|
|
Id: "CmdSuffix",
|
|
NTType: 35,
|
|
Index: 79,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdSuffix(X[0], nil, nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `CmdSuffix : CmdSuffix Word << ast.NewCmdSuffix(X[1], nil, X[0]) >>`,
|
|
Id: "CmdSuffix",
|
|
NTType: 35,
|
|
Index: 80,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewCmdSuffix(X[1], nil, X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `RedirectList : IoRedirect << ast.NewRedirectList(X[0]) >>`,
|
|
Id: "RedirectList",
|
|
NTType: 36,
|
|
Index: 81,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewRedirectList(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `RedirectList : RedirectList IoRedirect << ast.AppendToRedirectList(X[0], X[1]) >>`,
|
|
Id: "RedirectList",
|
|
NTType: 36,
|
|
Index: 82,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.AppendToRedirectList(X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoRedirect : IoFile << ast.NewIoRedirect(X[0], ast.IoNumber(0), nil) >>`,
|
|
Id: "IoRedirect",
|
|
NTType: 37,
|
|
Index: 83,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoRedirect(X[0], ast.IoNumber(0), nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoRedirect : IoNumber IoFile << ast.NewIoRedirect(X[1], X[0], nil) >>`,
|
|
Id: "IoRedirect",
|
|
NTType: 37,
|
|
Index: 84,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoRedirect(X[1], X[0], nil)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoRedirect : IoHere << ast.NewIoRedirect(nil, ast.IoNumber(0), X[0]) >>`,
|
|
Id: "IoRedirect",
|
|
NTType: 37,
|
|
Index: 85,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoRedirect(nil, ast.IoNumber(0), X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoRedirect : IoNumber IoHere << ast.NewIoRedirect(nil, X[0], X[1]) >>`,
|
|
Id: "IoRedirect",
|
|
NTType: 37,
|
|
Index: 86,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoRedirect(nil, X[0], X[1])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : "<" Filename << ast.NewIoFile(X[1], ast.R_STDIN) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 87,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_STDIN)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : "<&" Filename << ast.NewIoFile(X[1], ast.R_INFD) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 88,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_INFD)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : ">" Filename << ast.NewIoFile(X[1], ast.R_STDOUT) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 89,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_STDOUT)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : ">&" Filename << ast.NewIoFile(X[1], ast.R_OUTFD) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 90,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_OUTFD)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : ">>" Filename << ast.NewIoFile(X[1], ast.R_APPEND) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 91,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_APPEND)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : "<>" Filename << ast.NewIoFile(X[1], ast.R_ORWFD) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 92,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_ORWFD)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoFile : ">|" Filename << ast.NewIoFile(X[1], ast.R_OUTSP) >>`,
|
|
Id: "IoFile",
|
|
NTType: 38,
|
|
Index: 93,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoFile(X[1], ast.R_OUTSP)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Filename : Word << ast.NewFilename(X[0]) >>`,
|
|
Id: "Filename",
|
|
NTType: 39,
|
|
Index: 94,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewFilename(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoHere : "<<" HereEnd << ast.NewIoHere(X[1], false) >>`,
|
|
Id: "IoHere",
|
|
NTType: 40,
|
|
Index: 95,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoHere(X[1], false)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `IoHere : "<<-" HereEnd << ast.NewIoHere(X[1], true) >>`,
|
|
Id: "IoHere",
|
|
NTType: 40,
|
|
Index: 96,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewIoHere(X[1], true)
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `HereEnd : Word << ast.NewHereEnd(X[0]) >>`,
|
|
Id: "HereEnd",
|
|
NTType: 41,
|
|
Index: 97,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewHereEnd(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `NewlineList : "\n" << >>`,
|
|
Id: "NewlineList",
|
|
NTType: 42,
|
|
Index: 98,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `NewlineList : NewlineList "\n" << >>`,
|
|
Id: "NewlineList",
|
|
NTType: 42,
|
|
Index: 99,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Linebreak : NewlineList << >>`,
|
|
Id: "Linebreak",
|
|
NTType: 43,
|
|
Index: 100,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Linebreak : nothing << >>`,
|
|
Id: "Linebreak",
|
|
NTType: 43,
|
|
Index: 101,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SeparatorOp : "&" << ast.S_AMP, nil >>`,
|
|
Id: "SeparatorOp",
|
|
NTType: 44,
|
|
Index: 102,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.S_AMP, nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SeparatorOp : ";" << ast.S_SEMICOLON, nil >>`,
|
|
Id: "SeparatorOp",
|
|
NTType: 44,
|
|
Index: 103,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.S_SEMICOLON, nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Separator : SeparatorOp Linebreak << ast.NewSeparator(X[0]) >>`,
|
|
Id: "Separator",
|
|
NTType: 45,
|
|
Index: 104,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return ast.NewSeparator(X[0])
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `Separator : NewlineList << >>`,
|
|
Id: "Separator",
|
|
NTType: 45,
|
|
Index: 105,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SequentialSep : ";" Linebreak << >>`,
|
|
Id: "SequentialSep",
|
|
NTType: 46,
|
|
Index: 106,
|
|
NumSymbols: 2,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
ProdTabEntry{
|
|
String: `SequentialSep : NewlineList << >>`,
|
|
Id: "SequentialSep",
|
|
NTType: 46,
|
|
Index: 107,
|
|
NumSymbols: 1,
|
|
ReduceFunc: func(X []Attrib) (Attrib, error) {
|
|
return X[0], nil
|
|
},
|
|
},
|
|
|
|
}
|