Lex - 添加新行后未检测到标记
Lex - not detecting token after adding a new line
我正在尝试编写一个程序,从 PDDL 文件中读取动作及其组件。该程序应首先查找令牌 :action(
,然后查找 action name
等
以下是我的 lex 代码:
注意:这个问题的答案大多与:(action
令牌、action name
令牌和newline
令牌有关,所以你可能只看那些。 SC_ACNAME 我的意思是扫描操作名称等
%{
#include "myscanner.h"
%}
%START SC_ACNAME SC_PARAMETERS SC_PREDICATE SC_BODY
NAME [0-9a-zA-Z_\-]+
TEXT [0-9a-zA-Z?_\-( \t]+
TEXT_PARAM [0-9a-zA-Z?_\-( \t\n]+
TEXTBREAK [ \t\n]+
int lb_flag=0;
int pred_lb_flag = 0;
%%
\(:action {lb_flag++; BEGIN SC_ACNAME; return ACTION;}
<SC_ACNAME>{TEXT} {BEGIN SC_BODY; return ACTION_NAME;}
<SC_BODY>:parameters {BEGIN SC_PARAMETERS; return PARAMETER;}
<SC_PARAMETERS>{TEXT_PARAM} {lb_flag++; BEGIN SC_BODY; return PARAMETERS;}
<SC_BODY>:precondition {BEGIN SC_PREDICATE; return PRECONDITION;}
<SC_BODY>:effect {BEGIN SC_PREDICATE; return EFFECT;}
<SC_PREDICATE>\(and {pred_lb_flag++; return CONJUNCTION;}
<SC_PREDICATE>\(not {pred_lb_flag++; return NEGATION;}
<SC_PREDICATE>\({NAME}({TEXTBREAK}\?{NAME})+\) return PREDICATE;
<SC_PREDICATE>\) {if(pred_lb_flag) pred_lb_flag--; if(!pred_lb_flag) BEGIN SC_BODY; return RIGHT_BRACKET;}
<SC_BODY>\) {if(lb_flag) lb_flag--; if(!lb_flag) BEGIN 0; return RIGHT_BRACKET;}
<SC_PREDICATE,SC_BODY,SC_ACNAME>{TEXTBREAK} ;
%%
int yywrap(void)
{
return 1;
}
头文件(myscanner.h):
#define ACTION 1
#define ACTION_NAME 2
#define PARAMETER 3
#define PARAMETERS 4
#define PRECONDITION 5
#define EFFECT 6
#define CONJUNCTION 7
#define NEGATION 8
#define PREDICATE 9
#define RIGHT_BRACKET 10
在我的 C 程序中如下:
#include <stdio.h>
#include "myscanner.h"
extern int yylex();
extern int yylineno;
extern char* yytext;
int main(void)
{
int ntoken, vtoken;
ntoken = yylex();
while(ntoken)
{
printf("%d", ntoken);
print("%s", yytext);
ntoken = yylex();
}
return 0;
}
当我尝试标记包含 (:action move
的文件时,它会根据需要检测 :(action
和 action name
以及 returns ACTION 和 ACTION_NAME。但是当我在移动(动作名称)之后输入换行符时,它没有检测到任何东西。为什么它不识别令牌 (:action
?
编辑:
通过测试用例:domain.pddl
(:action move
失败测试用例:domain.pddl
(:action move<nl>
表示换行
我鼓励您在 main 中的 return 0;
之前添加例如 putchar('\n');
以刷新 printf,可能是因为那次失误,你没有打印任何东西吗?
如果 'f' 包含行 (:action move<nl>
并且我执行 a.out < f
打印 1(:action2 move
并且当该行未在 [=23= 中终止时也是如此](最后没有)
我正在尝试编写一个程序,从 PDDL 文件中读取动作及其组件。该程序应首先查找令牌 :action(
,然后查找 action name
等
以下是我的 lex 代码:
注意:这个问题的答案大多与:(action
令牌、action name
令牌和newline
令牌有关,所以你可能只看那些。 SC_ACNAME 我的意思是扫描操作名称等
%{
#include "myscanner.h"
%}
%START SC_ACNAME SC_PARAMETERS SC_PREDICATE SC_BODY
NAME [0-9a-zA-Z_\-]+
TEXT [0-9a-zA-Z?_\-( \t]+
TEXT_PARAM [0-9a-zA-Z?_\-( \t\n]+
TEXTBREAK [ \t\n]+
int lb_flag=0;
int pred_lb_flag = 0;
%%
\(:action {lb_flag++; BEGIN SC_ACNAME; return ACTION;}
<SC_ACNAME>{TEXT} {BEGIN SC_BODY; return ACTION_NAME;}
<SC_BODY>:parameters {BEGIN SC_PARAMETERS; return PARAMETER;}
<SC_PARAMETERS>{TEXT_PARAM} {lb_flag++; BEGIN SC_BODY; return PARAMETERS;}
<SC_BODY>:precondition {BEGIN SC_PREDICATE; return PRECONDITION;}
<SC_BODY>:effect {BEGIN SC_PREDICATE; return EFFECT;}
<SC_PREDICATE>\(and {pred_lb_flag++; return CONJUNCTION;}
<SC_PREDICATE>\(not {pred_lb_flag++; return NEGATION;}
<SC_PREDICATE>\({NAME}({TEXTBREAK}\?{NAME})+\) return PREDICATE;
<SC_PREDICATE>\) {if(pred_lb_flag) pred_lb_flag--; if(!pred_lb_flag) BEGIN SC_BODY; return RIGHT_BRACKET;}
<SC_BODY>\) {if(lb_flag) lb_flag--; if(!lb_flag) BEGIN 0; return RIGHT_BRACKET;}
<SC_PREDICATE,SC_BODY,SC_ACNAME>{TEXTBREAK} ;
%%
int yywrap(void)
{
return 1;
}
头文件(myscanner.h):
#define ACTION 1
#define ACTION_NAME 2
#define PARAMETER 3
#define PARAMETERS 4
#define PRECONDITION 5
#define EFFECT 6
#define CONJUNCTION 7
#define NEGATION 8
#define PREDICATE 9
#define RIGHT_BRACKET 10
在我的 C 程序中如下:
#include <stdio.h>
#include "myscanner.h"
extern int yylex();
extern int yylineno;
extern char* yytext;
int main(void)
{
int ntoken, vtoken;
ntoken = yylex();
while(ntoken)
{
printf("%d", ntoken);
print("%s", yytext);
ntoken = yylex();
}
return 0;
}
当我尝试标记包含 (:action move
的文件时,它会根据需要检测 :(action
和 action name
以及 returns ACTION 和 ACTION_NAME。但是当我在移动(动作名称)之后输入换行符时,它没有检测到任何东西。为什么它不识别令牌 (:action
?
编辑:
通过测试用例:domain.pddl
(:action move
失败测试用例:domain.pddl
(:action move<nl>
表示换行
我鼓励您在 main 中的 return 0;
之前添加例如 putchar('\n');
以刷新 printf,可能是因为那次失误,你没有打印任何东西吗?
如果 'f' 包含行 (:action move<nl>
并且我执行 a.out < f
打印 1(:action2 move
并且当该行未在 [=23= 中终止时也是如此](最后没有)