xsawyerx / guacamole

Guacamole is a parser toolkit for Standard Perl. It provides fully static BNF-based parsing capability to a reasonable subset of Perl.
https://metacpan.org/pod/Guacamole
20 stars 8 forks source link

Keywords with parenthesis are also parsed as subcalls #62

Closed xsawyerx closed 4 years ago

xsawyerx commented 4 years ago
parses('open $fh, "<", "foo";');   # unambiguous: keyword
parses('open($fh, "<", "foo");');  # ambiguous: keyword or subcall

Complete parse tree:

(Program
  (StatementSeq
    (Statement
      (NonBraceExprValueR
        (OpListKeywordExpr
          (OpKeywordOpenExpr
            'open'
            (OpListKeywordArg
              (ExprValueR
                (Value
                  (NonLiteral
                    (ParenExpr
                      (ExprComma
                        (ExprValueL
                          (Value
                            (NonLiteral
                              (Variable
                                (VarScalar '$' (VarName (Ident 'fh')) (ElemSeq0))))))
                        ','
                        (ExprComma
                          (ExprValueL
                            (Value
                              (Literal
                                (NonBraceLiteral (InterpolString '"' '<' '"')))))
                          ','
                          (ExprValueR
                            (Value
                              (Literal
                                (NonBraceLiteral (InterpolString '"' 'foo' '"'))))))))
                    (ElemSeq0)))))))))
    ';'))
(Program
  (StatementSeq
    (Statement
      (NonBraceExprValueR
        (NonBraceValue
          (NonLiteral
            (SubCall
              (NonQLikeIdent (NonQLikeFunctionName 'open'))
              (CallArgs
                (ParenExpr
                  (ExprComma
                    (ExprValueL
                      (Value
                        (NonLiteral
                          (Variable
                            (VarScalar '$' (VarName (Ident 'fh')) (ElemSeq0))))))
                    ','
                    (ExprComma
                      (ExprValueL
                        (Value
                          (Literal
                            (NonBraceLiteral (InterpolString '"' '<' '"')))))
                      ','
                      (ExprValueR
                        (Value
                          (Literal
                            (NonBraceLiteral (InterpolString '"' 'foo' '"'))))))))))))))
    ';'))
xsawyerx commented 4 years ago

This was resolved by reworking subroutine names as lexemes and using prioritizing keywords over them.