Precedences: [%fail none ={none} <{}] [%right p1 ={p1} <{}] [%split split ={split} <{}] Tokens: <$> [%fail none ={none} <{}] First set: [<$>] Follow set: [] [%fail none ={none} <{}] First set: [] Follow set: [] comma [%right p1 ={p1} <{}] First set: [comma] Follow set: [NAME, NUMBER, STRING] STRING [%right p1 ={p1} <{}] First set: [STRING] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] lparen [%right p1 ={p1} <{}] First set: [lparen] Follow set: [NAME, NUMBER, STRING, rparen] NUMBER [%right p1 ={p1} <{}] First set: [NUMBER] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] rparen [%right p1 ={p1} <{}] First set: [rparen] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] NEWLINE [%right p1 ={p1} <{}] First set: [NEWLINE] Follow set: [NEWLINE, NAME, NUMBER, STRING, <$>] NAME [%right p1 ={p1} <{}] First set: [NAME] Follow set: [lparen, comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] Non-terminals: file [%fail none ={none} <{}] First set: [NEWLINE, NAME, , NUMBER, STRING] Follow set: [<$>] Productions: file ::= file_c_0_s_o file. [p1] file ::= . [p1] predicate_c_2_q [%fail none ={none} <{}] First set: [, NAME, NUMBER, STRING] Follow set: [rparen] Productions: predicate_c_2_q ::= list. [p1] predicate_c_2_q ::= . [p1] list_c_1_s1 [%fail none ={none} <{}] First set: [comma, ] Follow set: [rparen] Productions: list_c_1_s1 ::= . [p1] list_c_1_s1 ::= comma expr list_c_1_s1. [p1] file_c_0_s_o [%fail none ={none} <{}] First set: [NEWLINE, NAME, NUMBER, STRING] Follow set: [NEWLINE, NAME, NUMBER, STRING, <$>] Productions: file_c_0_s_o ::= NEWLINE. [p1] file_c_0_s_o ::= expr. [p1] predicate [%fail none ={none} <{}] First set: [NAME] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] Productions: predicate ::= NAME lparen predicate_c_2_q rparen. [p1] atom [%fail none ={none} <{}] First set: [NAME, NUMBER, STRING] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] Productions: atom ::= NAME. [p1] atom ::= NUMBER. [p1] atom ::= STRING. [p1] expr [%fail none ={none} <{}] First set: [NAME, NUMBER, STRING] Follow set: [comma, rparen, NEWLINE, NAME, NUMBER, STRING, <$>] Productions: expr ::= atom. [p1] expr ::= predicate. [p1] list [%fail none ={none} <{}] First set: [NAME, NUMBER, STRING] Follow set: [rparen] Productions: list ::= expr list_c_1_s1. [p1] [%fail none ={none} <{}] First set: [NEWLINE, NAME, , <$>, NUMBER, STRING] Follow set: [] Productions: ::= file <$>. [none] Item sets: 0: ItemSet(kernel: [ ::= * file <$>., ] [none], added: '[predicate ::= * NAME lparen predicate_c_2_q rparen., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [expr ::= * predicate., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [expr ::= * atom., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file_c_0_s_o ::= * NEWLINE., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file_c_0_s_o ::= * expr., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file ::= * file_c_0_s_o file., <$>] [p1], [file ::= *., <$>] [p1], [atom ::= * NAME., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [atom ::= * NUMBER., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [atom ::= * STRING., <$>/STRING/NUMBER/NEWLINE/NAME] [p1]') 1: ItemSet(kernel: [atom ::= STRING *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 2: ItemSet(kernel: [file_c_0_s_o ::= NEWLINE *., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], added: '') 3: ItemSet(kernel: [atom ::= NUMBER *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 4: ItemSet(kernel: [predicate ::= NAME * lparen predicate_c_2_q rparen., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], [atom ::= NAME *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 5: ItemSet(kernel: [expr ::= predicate *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 6: ItemSet(kernel: [file_c_0_s_o ::= expr *., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], added: '') 7: ItemSet(kernel: [file ::= file_c_0_s_o * file., <$>] [p1], added: '[predicate ::= * NAME lparen predicate_c_2_q rparen., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [expr ::= * predicate., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [expr ::= * atom., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file_c_0_s_o ::= * NEWLINE., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file_c_0_s_o ::= * expr., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [file ::= * file_c_0_s_o file., <$>] [p1], [file ::= *., <$>] [p1], [atom ::= * NAME., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [atom ::= * NUMBER., <$>/STRING/NUMBER/NEWLINE/NAME] [p1], [atom ::= * STRING., <$>/STRING/NUMBER/NEWLINE/NAME] [p1]') 8: ItemSet(kernel: [ ::= file * <$>., ] [none], added: '') 9: ItemSet(kernel: [expr ::= atom *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 10: ItemSet(kernel: [predicate ::= NAME lparen * predicate_c_2_q rparen., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '[predicate_c_2_q ::= * list., rparen] [p1], [predicate_c_2_q ::= *., rparen] [p1], [predicate ::= * NAME lparen predicate_c_2_q rparen., comma/rparen] [p1], [expr ::= * predicate., comma/rparen] [p1], [expr ::= * atom., comma/rparen] [p1], [list ::= * expr list_c_1_s1., rparen] [p1], [atom ::= * NAME., comma/rparen] [p1], [atom ::= * NUMBER., comma/rparen] [p1], [atom ::= * STRING., comma/rparen] [p1]') 11: ItemSet(kernel: [file ::= file_c_0_s_o file *., <$>] [p1], added: '') 12: ItemSet(kernel: [ ::= file <$> *., ] [none], added: '') 13: ItemSet(kernel: [predicate ::= NAME lparen predicate_c_2_q * rparen., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 14: ItemSet(kernel: [list ::= expr * list_c_1_s1., rparen] [p1], added: '[list_c_1_s1 ::= * comma expr list_c_1_s1., rparen] [p1], [list_c_1_s1 ::= *., rparen] [p1]') 15: ItemSet(kernel: [predicate_c_2_q ::= list *., rparen] [p1], added: '') 16: ItemSet(kernel: [predicate ::= NAME lparen predicate_c_2_q rparen *., <$>/comma/STRING/NUMBER/rparen/NEWLINE/NAME] [p1], added: '') 17: ItemSet(kernel: [list_c_1_s1 ::= comma * expr list_c_1_s1., rparen] [p1], added: '[predicate ::= * NAME lparen predicate_c_2_q rparen., comma/rparen] [p1], [expr ::= * predicate., comma/rparen] [p1], [expr ::= * atom., comma/rparen] [p1], [atom ::= * NAME., comma/rparen] [p1], [atom ::= * NUMBER., comma/rparen] [p1], [atom ::= * STRING., comma/rparen] [p1]') 18: ItemSet(kernel: [list ::= expr list_c_1_s1 *., rparen] [p1], added: '') 19: ItemSet(kernel: [list_c_1_s1 ::= comma expr * list_c_1_s1., rparen] [p1], added: '[list_c_1_s1 ::= * comma expr list_c_1_s1., rparen] [p1], [list_c_1_s1 ::= *., rparen] [p1]') 20: ItemSet(kernel: [list_c_1_s1 ::= comma expr list_c_1_s1 *., rparen] [p1], added: '') Parsing.Spec: 8 tokens, 8 non-terminals, 15 productions, 21 states, 81 actions (0 split): Algorithm compatibility: GLR, LR Parsing tables: ============================================================================== State 0: (start state) ::= * file <$>. [none] predicate ::= * NAME lparen predicate_c_2_q rparen. [p1] expr ::= * predicate. [p1] expr ::= * atom. [p1] file_c_0_s_o ::= * NEWLINE. [p1] file_c_0_s_o ::= * expr. [p1] file ::= * file_c_0_s_o file. [p1] file ::= *. [p1] atom ::= * NAME. [p1] atom ::= * NUMBER. [p1] atom ::= * STRING. [p1] Goto: file : 8 file_c_0_s_o : 7 predicate : 5 atom : 9 expr : 6 Action: <$> : reduce file ::= . [p1] STRING : shift 1 [p1] NUMBER : shift 3 [p1] NEWLINE : shift 2 [p1] NAME : shift 4 [p1] ============================================================================== State 1: atom ::= STRING *. [p1] Goto: Action: <$> : reduce atom ::= STRING. [p1] comma : reduce atom ::= STRING. [p1] STRING : reduce atom ::= STRING. [p1] NUMBER : reduce atom ::= STRING. [p1] rparen : reduce atom ::= STRING. [p1] NEWLINE : reduce atom ::= STRING. [p1] NAME : reduce atom ::= STRING. [p1] ============================================================================== State 2: file_c_0_s_o ::= NEWLINE *. [p1] Goto: Action: <$> : reduce file_c_0_s_o ::= NEWLINE. [p1] STRING : reduce file_c_0_s_o ::= NEWLINE. [p1] NUMBER : reduce file_c_0_s_o ::= NEWLINE. [p1] NEWLINE : reduce file_c_0_s_o ::= NEWLINE. [p1] NAME : reduce file_c_0_s_o ::= NEWLINE. [p1] ============================================================================== State 3: atom ::= NUMBER *. [p1] Goto: Action: <$> : reduce atom ::= NUMBER. [p1] comma : reduce atom ::= NUMBER. [p1] STRING : reduce atom ::= NUMBER. [p1] NUMBER : reduce atom ::= NUMBER. [p1] rparen : reduce atom ::= NUMBER. [p1] NEWLINE : reduce atom ::= NUMBER. [p1] NAME : reduce atom ::= NUMBER. [p1] ============================================================================== State 4: predicate ::= NAME * lparen predicate_c_2_q rparen. [p1] atom ::= NAME *. [p1] Goto: Action: <$> : reduce atom ::= NAME. [p1] comma : reduce atom ::= NAME. [p1] STRING : reduce atom ::= NAME. [p1] lparen : shift 10 [p1] NUMBER : reduce atom ::= NAME. [p1] rparen : reduce atom ::= NAME. [p1] NEWLINE : reduce atom ::= NAME. [p1] NAME : reduce atom ::= NAME. [p1] ============================================================================== State 5: expr ::= predicate *. [p1] Goto: Action: <$> : reduce expr ::= predicate. [p1] comma : reduce expr ::= predicate. [p1] STRING : reduce expr ::= predicate. [p1] NUMBER : reduce expr ::= predicate. [p1] rparen : reduce expr ::= predicate. [p1] NEWLINE : reduce expr ::= predicate. [p1] NAME : reduce expr ::= predicate. [p1] ============================================================================== State 6: file_c_0_s_o ::= expr *. [p1] Goto: Action: <$> : reduce file_c_0_s_o ::= expr. [p1] STRING : reduce file_c_0_s_o ::= expr. [p1] NUMBER : reduce file_c_0_s_o ::= expr. [p1] NEWLINE : reduce file_c_0_s_o ::= expr. [p1] NAME : reduce file_c_0_s_o ::= expr. [p1] ============================================================================== State 7: predicate ::= * NAME lparen predicate_c_2_q rparen. [p1] expr ::= * predicate. [p1] expr ::= * atom. [p1] file_c_0_s_o ::= * NEWLINE. [p1] file_c_0_s_o ::= * expr. [p1] file ::= * file_c_0_s_o file. [p1] file ::= *. [p1] atom ::= * NAME. [p1] atom ::= * NUMBER. [p1] atom ::= * STRING. [p1] file ::= file_c_0_s_o * file. [p1] Goto: file : 11 file_c_0_s_o : 7 predicate : 5 atom : 9 expr : 6 Action: <$> : reduce file ::= . [p1] STRING : shift 1 [p1] NUMBER : shift 3 [p1] NEWLINE : shift 2 [p1] NAME : shift 4 [p1] ============================================================================== State 8: ::= file * <$>. [none] Goto: Action: <$> : shift 12 [none] ============================================================================== State 9: expr ::= atom *. [p1] Goto: Action: <$> : reduce expr ::= atom. [p1] comma : reduce expr ::= atom. [p1] STRING : reduce expr ::= atom. [p1] NUMBER : reduce expr ::= atom. [p1] rparen : reduce expr ::= atom. [p1] NEWLINE : reduce expr ::= atom. [p1] NAME : reduce expr ::= atom. [p1] ============================================================================== State 10: predicate_c_2_q ::= * list. [p1] predicate_c_2_q ::= *. [p1] predicate ::= * NAME lparen predicate_c_2_q rparen. [p1] expr ::= * predicate. [p1] expr ::= * atom. [p1] list ::= * expr list_c_1_s1. [p1] atom ::= * NAME. [p1] atom ::= * NUMBER. [p1] atom ::= * STRING. [p1] predicate ::= NAME lparen * predicate_c_2_q rparen. [p1] Goto: predicate_c_2_q : 13 predicate : 5 atom : 9 expr : 14 list : 15 Action: STRING : shift 1 [p1] NUMBER : shift 3 [p1] rparen : reduce predicate_c_2_q ::= . [p1] NAME : shift 4 [p1] ============================================================================== State 11: file ::= file_c_0_s_o file *. [p1] Goto: Action: <$> : reduce file ::= file_c_0_s_o file. [p1] ============================================================================== State 12: ::= file <$> *. [none] Goto: Action: : reduce ::= file <$>. [none] ============================================================================== State 13: predicate ::= NAME lparen predicate_c_2_q * rparen. [p1] Goto: Action: rparen : shift 16 [p1] ============================================================================== State 14: list_c_1_s1 ::= * comma expr list_c_1_s1. [p1] list_c_1_s1 ::= *. [p1] list ::= expr * list_c_1_s1. [p1] Goto: list_c_1_s1 : 18 Action: comma : shift 17 [p1] rparen : reduce list_c_1_s1 ::= . [p1] ============================================================================== State 15: predicate_c_2_q ::= list *. [p1] Goto: Action: rparen : reduce predicate_c_2_q ::= list. [p1] ============================================================================== State 16: predicate ::= NAME lparen predicate_c_2_q rparen *. [p1] Goto: Action: <$> : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] comma : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] STRING : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] NUMBER : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] rparen : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] NEWLINE : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] NAME : reduce predicate ::= NAME lparen predicate_c_2_q rparen. [p1] ============================================================================== State 17: predicate ::= * NAME lparen predicate_c_2_q rparen. [p1] expr ::= * predicate. [p1] expr ::= * atom. [p1] atom ::= * NAME. [p1] atom ::= * NUMBER. [p1] atom ::= * STRING. [p1] list_c_1_s1 ::= comma * expr list_c_1_s1. [p1] Goto: predicate : 5 atom : 9 expr : 19 Action: STRING : shift 1 [p1] NUMBER : shift 3 [p1] NAME : shift 4 [p1] ============================================================================== State 18: list ::= expr list_c_1_s1 *. [p1] Goto: Action: rparen : reduce list ::= expr list_c_1_s1. [p1] ============================================================================== State 19: list_c_1_s1 ::= * comma expr list_c_1_s1. [p1] list_c_1_s1 ::= *. [p1] list_c_1_s1 ::= comma expr * list_c_1_s1. [p1] Goto: list_c_1_s1 : 20 Action: comma : shift 17 [p1] rparen : reduce list_c_1_s1 ::= . [p1] ============================================================================== State 20: list_c_1_s1 ::= comma expr list_c_1_s1 *. [p1] Goto: Action: rparen : reduce list_c_1_s1 ::= comma expr list_c_1_s1. [p1]