1

I work on inherited code base that uses Quex 0.65.7. It compiles, but requires -fpermissive during compilation, which isn't something that I'm willing to live with. As code requiring -fpermissive option in g++ lives in files provided as a base by Quex itself, I'm trying to build lexer using Quex 0.69.4, installed using quex_0.69.4-0_all.deb file from project's download page. Lexer definition is very simple. It lives in file lexer.qx, wholly pasted below:

header {
        #include <cstdlib>
}

define {
        P_IDENTIFIER          [_a-zA-Z][_a-zA-Z0-9]*
}

mode ONE_AND_ONLY
{
    <<EOF>>     => RULE_TOKEN_TERMINATION;

    [ \t\r\n]+  { }
    "/*"([^*]|[\r\n]|("*"+([^*/]|[\r\n])))*"*"+"/" { }
    "//"[^\n]*"\n"           { }
    "+"    => RULE_TOKEN_PLUS;
    "-"    => RULE_TOKEN_MINUS;
    "/"    => RULE_TOKEN_DIVIDE;
    "*"    => RULE_TOKEN_TIMES;
    ";"    => RULE_TOKEN_SEMICOLON;
    "("    => RULE_TOKEN_LEFTPAREN;
    ")"    => RULE_TOKEN_RIGHTPAREN;
    "||"   => RULE_TOKEN_LOGICALOR;
    "&&"   => RULE_TOKEN_LOGICALAND;
    "<="   => RULE_TOKEN_LESSEQUAL;
    ">="   => RULE_TOKEN_GREATEREQUAL;
    "<"    => RULE_TOKEN_LESS;
    ">"    => RULE_TOKEN_GREATER;
    "["    => RULE_TOKEN_LEFTSQBRACKET;
    "]"    => RULE_TOKEN_RIGHTSQBRACKET;
    "=="   => RULE_TOKEN_EQUAL;
    {P_IDENTIFIER} => RULE_TOKEN_IDENTIFIER(Lexeme);
    [0-9]+      => RULE_TOKEN_INTEGER(Lexeme);
}

From this, lexer is generated as follows:

quex -i ../lexer.qx -o zs_expr_eng --output-directory . --foreign-token-id-file ../../grammar/grammar.h --token-id-prefix RULE_TOKEN_ --fes xx --foreign-token-id-file-show

File mentioned in --foreign-token-id-file option is equally simple:

#define RULE_TOKEN_TERMINATION                      1
#define RULE_TOKEN_UNINITIALIZED                    2
#define RULE_TOKEN_SEMICOLON                        3
#define RULE_TOKEN_IDENTIFIER                       4
#define RULE_TOKEN_LEFTSQBRACKET                    5
#define RULE_TOKEN_RIGHTSQBRACKET                   6
#define RULE_TOKEN_LOGICALOR                        7
#define RULE_TOKEN_LOGICALAND                       8
#define RULE_TOKEN_LESSEQUAL                        9
#define RULE_TOKEN_GREATEREQUAL                    10
#define RULE_TOKEN_LESS                            11
#define RULE_TOKEN_GREATER                         12
#define RULE_TOKEN_EQUAL                           13
#define RULE_TOKEN_PLUS                            14
#define RULE_TOKEN_MINUS                           15
#define RULE_TOKEN_DIVIDE                          16
#define RULE_TOKEN_TIMES                           17
#define RULE_TOKEN_LEFTPAREN                       18
#define RULE_TOKEN_RIGHTPAREN                      19
#define RULE_TOKEN_INTEGER                         20

Output from option --foreign-id-file-show indicates that all tokens were read and are understood:

command line: Token ids found in file '../../grammar/grammar.h' {
command line:      RULE_TOKEN_DIVIDE         => 'DIVIDE'
command line:      RULE_TOKEN_EQUAL          => 'EQUAL'
command line:      RULE_TOKEN_GREATER        => 'GREATER'
command line:      RULE_TOKEN_GREATEREQUAL   => 'GREATEREQUAL'
command line:      RULE_TOKEN_IDENTIFIER     => 'IDENTIFIER'
command line:      RULE_TOKEN_INTEGER        => 'INTEGER'
command line:      RULE_TOKEN_LEFTPAREN      => 'LEFTPAREN'
command line:      RULE_TOKEN_LEFTSQBRACKET  => 'LEFTSQBRACKET'
command line:      RULE_TOKEN_LESS           => 'LESS'
command line:      RULE_TOKEN_LESSEQUAL      => 'LESSEQUAL'
command line:      RULE_TOKEN_LOGICALAND     => 'LOGICALAND'
command line:      RULE_TOKEN_LOGICALOR      => 'LOGICALOR'
command line:      RULE_TOKEN_MINUS          => 'MINUS'
command line:      RULE_TOKEN_PLUS           => 'PLUS'
command line:      RULE_TOKEN_RIGHTPAREN     => 'RIGHTPAREN'
command line:      RULE_TOKEN_RIGHTSQBRACKET => 'RIGHTSQBRACKET'
command line:      RULE_TOKEN_SEMICOLON      => 'SEMICOLON'
command line:      RULE_TOKEN_TERMINATION    => 'TERMINATION'
command line:      RULE_TOKEN_TIMES          => 'TIMES'
command line:      RULE_TOKEN_UNINITIALIZED  => 'UNINITIALIZED'
command line: }

Lexer generation finishes successfully, but among generated files is zs_expr_eng-token.hxx and its content is pasted below:

#include "zs_expr_eng-token.hxx"

This is not everything, there are also 7 new line characters - so it is basically empty and includes itself without guards. This of course means that compiler fails to compile this source code:

Compiling prog.cpp
In file included from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                 from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
<many many maaaaany lines cut>
                  from lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1,
                  from lexer/package-arm-linux-gnueabihf/./lib/declarations:22,
                  from zs_expr_eng.hxx:49,
                  from grammar.y:13,
                  from prog.cpp:2:
 lexer/package-arm-linux-gnueabihf/zs_expr_eng-token.hxx:1:33: error: #include nested too deeply
  #include "zs_expr_eng-token.hxx"
                                  ^

Any ideas what should be done to prevent it? I don't think this is common occurrence as it would break all Quex-based projects.

4

1 回答 1

0

所以看起来这个版本(0.69.4)或更早的版本引入了相当多的变化,并且还破坏了对不同文件扩展名(--fes--file-extension-scheme)的支持,或者至少在使用此选项时没有抱怨。--fes xx从调用中删除选项quex并根据需要更改文件名(以及更改quex::Token为生成的类的名称)后,一切都按预期工作。至少现在。

于 2019-08-07T20:33:14.863 回答