1

次のルールを定義する文法があります。

constantValue = qi::token(ID_FLOAT) | qi::token(ID_INTEGER);

postfixExpression = primaryExpression | 
        (postfixExpression >> qi::token(ID_OPENBRACKET) >> qi::token(ID_INTEGER) >> qi::token(ID_CLOSEBRACKET)) |
        (postfixExpression >> qi::token(ID_DOT) >> qi::token(ID_IDENTIFIER));

primaryExpression = qi::token(ID_IDENTIFIER) | 
        constantValue | 
        (qi::token(ID_OPENPAREN) >> primaryExpression >> qi::token(ID_CLOSEPAREN));

ges = postfixExpression >> qi::eoi;

次の文字列と一致させたい:

test [1] testident.ident

そしてそれは一致するべきではありません

test [1.2] testident.5

ただし、最初の2つの文字列とは一致しません。

レクサーコンストラクターは次のとおりです。

custom_lexer()
    : identifier("[a-zA-Z_][a-zA-Z0-9_]*")
    , white_space("[ \\t\\n]+")
    , integer_value("[1-9][0-9]*")
    , hex_value("0[xX][0-9a-fA-F]+")
    , float_value("[0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?")
    , float_value2("[0-9]+\\.([eE][+-]?[0-9]+)?")
    , punctuator("&>|\\*\\*|\\*|\\+|-|~|!|\\/|%|<<|>>|<|>|<=|>=|==|!=|\\^|&|\\||\\^\\^|&&|\\|\\||\\?|:|,")// [ ] ( ) . &> ** * + - ~ ! / % << >> < > <= >= == != ^ & | ^^ && || ? : ,
{
    using boost::spirit::lex::_start;
    using boost::spirit::lex::_end;

    this->self.add
        (identifier, ID_IDENTIFIER) 
        /*(white_space, ID_WHITESPACE)*/ 
        (integer_value, ID_INTEGER)
        (hex_value, ID_INTEGER)
        (float_value, ID_FLOAT)
        (float_value2, ID_FLOAT)
        ("\\(", ID_OPENPAREN)
        ("\\)", ID_CLOSEPAREN)
        ("\\[", ID_OPENBRACKET)
        ("\\]", ID_CLOSEBRACKET)
        ("\\.", ID_DOT)
        (punctuator, ID_PUNCTUATOR)
        ;

    this->self("WS") = white_space;
}

上記の文字列に一致しないのはなぜですか?

ありがとうトビアス

4

1 に答える 1

2

私は理由を見つけました-私はルールを言い換えなければなりませんでした:

postfixExpression = primaryExpression >> *((qi::token(ID_OPENBRACKET) >> qi::token(ID_INTEGER) >> qi::token(ID_CLOSEBRACKET)) | (qi::token(ID_DOT) >> qi::token(ID_IDENTIFIER)));

なぜ必要なのかわかりませんが、今はうまくいくようです。

于 2012-11-15T23:11:59.090 に答える