Flex:如何将一个术语定义为一行开头的第一个术语(专门)

时间:2015-12-19 21:06:29

标签: flex-lexer lex

我需要一些关于我在flex代码中遇到的问题的帮助。

我的任务:编写一个flex代码,用于识别编程语言的声明部分,如下所述。

让编程语言PL。其变量定义部分描述如下:

一开始我们必须以关键字" var"开头。写完这个关键字之后,我们必须编写用逗号","分隔的变量名(一个或多个)。然后冒号":"插入后,我们必须写一个变量类型(比如我的例子中的实数,布尔值,整数或字符),然后是分号&#34 ;;"。在执行前面的步骤后,有可能将新变量声明为新行(变量名用逗号分隔","后跟冒号":"后跟变量类型后跟分号&#34 ;;"),但我们不能使用" var"新行开头的关键字(" var"关键字写一次!!!)

E.g。

var number_of_attendants, sum: integer;
ticket_price: real;
symbols: char;

具体而言,我不知道如何定义每个声明部分必须仅使用' var'关键词。到现在为止,如果我开始直接声明一个变量的声明部分,比如x(没有在行的开头写入" var")那么就不会发生错误(不需要的状态)。

我目前的灵活代码如下:

%{
#include <stdio.h>
%}
VAR_DEFINER "var"
VAR_NAME [a-zA-Z][a-zA-Z0-9_]*
VAR_TYPE "real"|"boolean"|"integer"|"char"
SUBEXPRESSION [{VAR_NAME}[","{VAR_NAME}]*":"[ \t\n]*{VAR_TYPE}";"]+
EXPRESSION {VAR_DEFINER}{SUBEXPRESSION}
%%
^{EXPRESSION}                 { 
                                  printf("This is not a well-syntaxed expression!\n"); 
                                  return 0;
                            }
{EXPRESSION}                        printf("This is a well-syntaxed expression!\n");
";"[ \t\n]*{VAR_DEFINER}    {
                                  printf("The keyword 'var' is defined once at the beginning of a new line. You can not use it again\n");
                                  return 0;
                            }
{VAR_DEFINER}                  printf("A keyword: %s\n", yytext);
^{VAR_DEFINER}                 printf("Each and every declaration part must start with the 'var' keyword.\n");
{VAR_TYPE}";"                     printf("The variable type is: %s\n", yytext);
{VAR_NAME}                        printf("A variable name: %s\n", yytext);
","/[ \t\n]*{VAR_NAME}            /* eat up commas */
":"/[ \t\n]*{VAR_TYPE}";"         /* eat up single colon */
[ \t\n]+                          /* eat up whitespace */
.                           {
                                  printf("Unrecognized character: %s\n", yytext);
                                  return 0;
                            }
%%
main(argc, argv)
int argc;
char** argv;
{
++argv, --argc;
if (argc > 0) 
yyin = fopen(argv[0],"r");
else 
yyin = stdin;
yylex();
}

我希望尽可能明确地做到这一点。

我期待着阅读你的答案!

0 个答案:

没有答案