【问题标题】:How to get such pattern matching of regular expression in lex如何在lex中获得正则表达式的这种模式匹配
【发布时间】:2015-11-26 21:48:12
【问题描述】:

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

名词 词名词义

我成功获得了 nounwordname,但无法为词义设计模式。我的代码是:

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 应该等于john 并且meaning 应该等于This is a name

【问题讨论】:

  • 也许你需要使用状态。在正常状态下,您分别对待每个单词。在“定义”状态下,当检测到“:”时输入,当检测到换行符时退出,您收集所有字符(换行符除外)来创建定义。

标签: flex-lexer lex


【解决方案1】:

同意 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); }

  • 是切换到 INITIAL 还是 TYPE 取决于您可能会在词法分析器中添加哪些其他内容(例如忽略注释行和空格)。

进一步阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多