【发布时间】:2021-02-16 16:01:08
【问题描述】:
我有一个用 C++ 编写的 flex 程序,需要完成以下规则:
我希望 yytext 接受以下内容:
○ 零个或以下字符之一 ABCDEFGH
例如 - 输入:
“三角形 ABC”是一个有效的形状,我希望程序打印“有效的形状”
“三角形 AAC”不是一个有效的形状,因为它包含一个双 A,我希望程序在这种情况下不打印任何内容
“三角形 ABCD”不是一个有效的形状,因为它包含四个字母,我希望程序在这种情况下也不打印任何内容。
下面的代码以及到目前为止我尝试过的正则表达式:
%{
/** Methods and Variables initialization **/
%}
corner corner" "[A-H]
line line" "[A-H]{2}
triangle triangle" "[A-H]{3}
square rectangle" "[A-H]{4}
poly pentagon" "[A-H]{5}
hexa hexagon" "[A-H]{6}
hepta heptagon" "[A-H]{7}
octa octagon" "[A-H]{8}
/** Below is the rule section -- yytext is the matched string returned to the program **/
%%
{corner}
{line} |
{triangle} |
{square} |
{poly} |
{hexa} |
{hepta} |
{octa} {
printf("Valid shape: %s", yytext);
}
.
%%
int main() {
yylex();
return 0;
}
// yywrap() - wraps the above rule section
int yywrap(void)
{
return 1;
}
当前输入:
三角AAC
当前输出:
有效形状:三角形 AAC(我们不想要那个)
当前输入:
三角形 AB
当前输出:
有效形状:三角形ABC
【问题讨论】:
-
正则表达式是错误的工具来实现每个字符 ABC 只出现一次。为什么不为此添加语义检查(例如在规则的操作中)?在 C 或 C++ 中,这样的检查很容易实现。
-
你有什么建议?我需要以某种方式检查匹配字符串(yytext)或类似字符串中的双字符。
-
也许你应该和@NickGeo 聚在一起:stackoverflow.com/questions/66213163/…(也许是你的同学)。在你们两个之间,你们应该能够完成任务:-)
-
另外,正如我在那里所说的,当问“我的代码不起作用”形式的问题时,绝对有必要提供一个minimal reproducible example,这是一个可编译的程序(通常不是你的实际程序,但仍然是可以制成可执行文件的真实程序)。您应该提供准确的输入(如果适用)并解释您在使用您提供的程序时遇到的确切问题。无论您是否在这里提出问题,这都是一个很好的练习:减少程序中不相关的并发症的过程有助于您专注于问题,而且您通常会自己发现问题。
-
我编辑了标题,以便它可以更专注于问题,我将通过您提供的链接寻找更多关于您正在实施的细节。
标签: c++ c regex flex-lexer lex