如何在lex中获得正则表达式的这种模式匹配

时间:2015-11-26 21:48:12

标签: flex-lexer lex

您好我想检查正则表达式中的特定模式,但我没有这样做。输入应该像

名词 wordname wordmeaning

我成功获得名词 wordname ,但无法设计出词义的模式。我的代码是:

int state;
char *meaning;
char *wordd; 

^verb   { state=VERB; }
^adj    { state = ADJ; }
^adv    { state = ADV; }
^noun   { state = NOUN; }
^prep   { state = PREP; }
^pron   { state = PRON; }
^conj   { state = CONJ; }

//my try but failed
[:\a-z]   {
meaning=yytext;
printf(" Meaning is getting detected %s", meaning);

}

[a-zA-Z]+  {
word=yytext;

}

示例输入:

noun john:This is a name

现在word应该等于johnmeaning应该等于This is a name

1 个答案:

答案 0 :(得分:0)

同意lex状态(也称为开始条件)是要走的路(奇怪,但没有有用的教程)。

简言之:

  • 您的应用程序可以组织为状态,使用一个用于“名词”,一个用于“john”,一个用于定义(在冒号后)。
  • 在lex文件的顶部
  • ,声明状态,例如,

    %s TYPE NAME VALUE

  • 大写字母不是必需的,但由于你是定义常量,这是一个很好的约定。
  • 在模式旁边,将这些状态名称放在< >括号中,告诉lex模式仅在这些状态中使用。当重要时,您可以列出多个以逗号分隔的状态。但是你的lex文件可能不需要那样。
  • 预定义了一个州:INITIAL
  • 您的程序使用BEGIN()宏在操作中切换状态,例如,

    { BEGIN(TYPE); }

  • 如果您的输入格式正确,则很简单:当识别出每个“类型”时,它会以NAME状态开始。
  • NAME状态下,你的词法分析器会查找你认为名字应该是什么,例如,

    <NAME>[[:alpha:]][[:alnum:]]+ { my_name = strdup(yytext); }

  • 名称以冒号结尾,所以

    <NAME>":" { BEGIN(VALUE); }

  • 然后是值,直到行尾,例如,

    <VALUE>.* { my_value = strdup(yytext); BEGIN(INITIAL); }

  • 是否切换到INITIALTYPE取决于您可能添加到词法分析器的其他内容(例如忽略注释行和空格)。

进一步阅读: