Skip to content
This repository was archived by the owner on Nov 25, 2025. It is now read-only.
This repository was archived by the owner on Nov 25, 2025. It is now read-only.

再帰的に呼ばれる場合の表現 #34

@RYOSKATE

Description

@RYOSKATE

C/C++のg4ファイルだと例えば以下のように
本来ならそれぞれUniUnaryOp,UniFieldAccess,UniMethodCall,UniCast,UniBinOpなどにしたいものが一箇所にまとまっており現在はとりあえず全てUniBinOpとして認識させている。

postfixexpression => UniBinOp
:
    primaryexpression$RETURN
    | postfixexpression$left LeftBracket$operator assignmentexpression$right RightBracket$operator
    | postfixexpression '[' bracedinitlist ']'
    | postfixexpression$left LeftParen$operator expressionlist?$right RightParen$operator
    | simpletypespecifier '(' expressionlist? ')'
    | typenamespecifier '(' expressionlist? ')'
    | simpletypespecifier bracedinitlist
    | typenamespecifier bracedinitlist
    | postfixexpression$left Dot$operator Template? idexpressionlapper$right
    | postfixexpression$left Arrow$operator Template? idexpressionlapper$right
    | postfixexpression$left Dot$operator pseudodestructorname$right
    | postfixexpression$left Arrow$operator pseudodestructorname$right
    | postfixexpression '++'
    | postfixexpression '--'
    | Dynamic_cast '<' typeid '>' '(' expression ')'
    | Static_cast '<' typeid '>' '(' expression ')'
    | Reinterpret_cast '<' typeid '>' '(' expression ')'
    | Const_cast '<' typeid '>' '(' expression ')'
    | Typeid '(' expression ')'
    | Typeid '(' typeid ')'
;

これを例えば以下のようにしてもpostfixexpressionが再帰的に呼ばれる場合のためか認識されない。


postfixexpression => UniBinOp
:
    primaryexpression$RETURN
    | fieldaccessexpression$RETURN
    | postfixexpression '[' bracedinitlist ']'
    | methodcallexpression$RETURN
    | simpletypespecifier bracedinitlist
    | typenamespecifier bracedinitlist
    | postincrementexpression$RETURN
    | Dynamic_cast '<' typeid '>' '(' expression ')'
    | Static_cast '<' typeid '>' '(' expression ')'
    | Reinterpret_cast '<' typeid '>' '(' expression ')'
    | Const_cast '<' typeid '>' '(' expression ')'
    | Typeid '(' expression ')'
    | Typeid '(' typeid ')'
;
fieldaccessexpression => UniFieldAccess
:
       postfixexpression$fieldName LeftBracketassignmentexpression$index RightBracket
    | postfixexpression$receiver DotTemplate? idexpressionlapper$fieldName
    | postfixexpression$receiver ArrowTemplate? idexpressionlapper$fieldName
    | postfixexpression$receiver Dotpseudodestructorname$fieldName
    | postfixexpression$receiver Arrowpseudodestructorname$fieldName
;
methodcallexpression => UniMethodCall
:
       postfixexpression$methodName '(' expressionlist?$args ')'
    | simpletypespecifier$methodName '(' expressionlist?$args ')'
    | typenamespecifier$methodName '(' expressionlist?$args ')'
;

postincrementexpression => UniUnaryOp
:
       postfixexpression$value PlusPlus$operator
    | postfixexpression$value MinusMinus$operator
;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions