标签: lex

是否可以在同一个应用程序中使用两个或更多Lex/Yacc解析器

我有一个应用程序,我已经有一种语法的解析器,我需要为另一个目的添加第二个不同的语法.

是否有可能有多个?

如果是这样,你如何获得另一个切入点?

谢谢

大卫艾伦芬奇

parsing yacc lex bison flex-lexer

7
推荐指数
1
解决办法
859
查看次数

Python程序设计语言的词汇分析

有谁知道Python的FLEX或LEX规范文件存在于何处?例如,这是ANSI C编程语言的lex规范:http://www.quut.com/c/ANSI-C-grammar-l-1998.html

仅供参考,我正在尝试将代码突出显示到Cocoa应用程序中.正则表达式不会这样做,因为我也希望语法解析折叠代码并识别块.

python lex syntax-highlighting lexical-analysis

7
推荐指数
1
解决办法
2511
查看次数

如何在lex中使用yy_scan_string

我想在yacc的main函数中解析我给解析器的字符串.我知道这可以通过使用来完成,yy_scan_string但我不知道如何使用它.我搜索了网页和手册页,但我仍然不清楚.请帮我.

c yacc lex

7
推荐指数
3
解决办法
1万
查看次数

使用Ocamllex作为lexing字符串(The Tiger Compiler)

我正在尝试遵循Appel的"ML中的现代编译器实现",并且正在使用Ocamllex编写词法分析器.

规范要求词法分析器转换转义序列返回字符串.以下代码摘自ocamllex输入文件:

 rule tiger = parse
 ...
 | '"'
     { let buffer = Buffer.create 1 in
       STRING (stringl buffer lexbuf)
     }
 and  stringl buffer = parse
 | '"' { Buffer.contents buffer }
 | "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
 | '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf }
 | '\\' '\\' …
Run Code Online (Sandbox Code Playgroud)

ocaml lex tiger ocamllex

7
推荐指数
1
解决办法
1636
查看次数

如何设置flex/bison规则来解析逗号分隔的参数列表

我希望能够使用flex/bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的带括号的)列表.

一些例如可解析的列表:

  • 1
  • 1,2
  • (1,2)
  • (3)
  • 3,4,5
  • (3,4,5,6-)

等等

我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(在提供有效列表时我得到语法错误).关于我如何设置它的任何建议?

cList :   ELEMENT
           {
              ...
           }
        | cList COMMA ELEMENT
           {
              ...
           }
        ;

topLevelList :  LPAREN cList RPAREN
                 {
                     ...                 
                 }
              | cList
                 {
                     ...
                 }
          ;
Run Code Online (Sandbox Code Playgroud)

parsing yacc lex bison flex-lexer

7
推荐指数
1
解决办法
5340
查看次数

Flex ++坏字符错误等等.新的flex

我们刚刚开始使用flex为项目构建词法分析器,但是我们无法弄清楚如何让它工作.我复制教程中给出的示例代码,并尝试以tut文件作为参数运行flex ++,但每次只收到一个错误.例如

输入文件(calc.l)

%name Scanner
%define IOSTREAM

DIGIT   [0-9]
DIGIT1  [1-9]

%%

"+"               { cout << "operator <" << yytext[0] << ">" << endl; }
"-"               { cout << "operator <" << yytext[0] << ">" << endl; }
"="               { cout << "operator <" << yytext[0] << ">" << endl; }
{DIGIT1}{DIGIT}*  { cout << "  number <" << yytext    << ">" << endl; }
.                 { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } …
Run Code Online (Sandbox Code Playgroud)

lex flex++ flex-lexer

7
推荐指数
1
解决办法
5911
查看次数

从lex和yacc语法生成编译器

我正在尝试生成一个编译器,所以我可以在之后传递一个.c文件.

我从http://www.quut.com/c/ANSI-C-grammar-y.html下载了YACC和LEX语法,并将它们命名为clexyacc.l和clexyacc.y

在终端上生成它时我做了:

yacc -d clexyacc.y
lex clexyacc.l
Run Code Online (Sandbox Code Playgroud)

一切都很好.当我继续到最后一部分时,我得到了一些错误.

最后一部分是:cc lex.yy.c y.tab.c -oclexyacc.exe

但我得到这些错误:

y.tab.c:2261:16: warning: implicit declaration of function 'yylex' is invalid in
      C99 [-Wimplicit-function-declaration]
      yychar = YYLEX;
               ^
y.tab.c:1617:16: note: expanded from macro 'YYLEX'
# define YYLEX yylex ()
               ^
y.tab.c:2379:7: warning: implicit declaration of function 'yyerror' is invalid
      in C99 [-Wimplicit-function-declaration]
      yyerror (YY_("syntax error"));
      ^
clexyacc.y:530:6: error: conflicting types for 'yyerror'
void yyerror(const char *s)
     ^
y.tab.c:2379:7: note: previous implicit declaration is here
      yyerror (YY_("syntax …
Run Code Online (Sandbox Code Playgroud)

c yacc lex

7
推荐指数
1
解决办法
1万
查看次数

JFlex将嵌套注释作为一个标记进行匹配

在Mathematica中,注释以#(*结尾开头,*)注释可以嵌套.我目前使用JFlex扫描注释的方法包含以下代码

%xstate IN_COMMENT

"(*"  { yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}

<IN_COMMENT> {
  "(*"        {yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}
  [^\*\)\(]*  {return MathematicaElementTypes.COMMENT;}
  "*)"        {yypopstate(); return MathematicaElementTypes.COMMENT;}
  [\*\)\(]    {return MathematicaElementTypes.COMMENT;}
  .           {return MathematicaElementTypes.BAD_CHARACTER;}
}
Run Code Online (Sandbox Code Playgroud)

方法yypushstateyypopstate定义为

private final LinkedList<Integer> states = new LinkedList();

private void yypushstate(int state) {
    states.addFirst(yystate());
    yybegin(state);
}
private void yypopstate() {
    final int state = states.removeFirst();
    yybegin(state);
}
Run Code Online (Sandbox Code Playgroud)

让我有机会跟踪我正在处理多少嵌套级别的评论.

不幸的是,这导致COMMENT一个注释的几个标记,因为我必须匹配嵌套的注释开始和注释结束.

问:是否有可能与JFlex的使用其API使用类似的方法yypushbackadvance()等,以在整个注释范围恰好返回一个道理,即使评论嵌套?

grammar comments lex jflex

7
推荐指数
1
解决办法
865
查看次数

Lex/Flex:C/C++中字符串文字的正则表达式?

我在这里看ANSI C语法.

此页面包含许多用于ANSI C的Lex/Flex中的正则表达式.

在理解字符串文字的正则表达式时遇到问题.

他们提到正则表达为 \"(\\.|[^\\"])*\"

据我所知,\"这用于双引号,\\用于转义字符,.用于任何字符,除了escape character*为零或多次.

[^\\"]暗示字符除外\,".

因此,在我看来,正则表达应该是\"(\\.)*\".

你能给出一些正则表达式失败的字符串吗?

要么

他们为什么用过[^\\"]

c c++ regex lex flex-lexer

7
推荐指数
1
解决办法
5111
查看次数

filename.l:16:在操作中遇到 EOF

我有一个像这样的 lex 文件

   %{
        #include "y.tab.h"
    %}

    %%
    "print"     {return print;}
    "exit"      {return exit_command;}
    [a-zA-Z]    {yylval.id = atoi(yytext); return identifier;}
    [0-9]+      {yylval.num = atoi(yytext);} return number;}
    [ \t\n]     ;
    [-+=;]      {return yytext[0];}
    .       {ECHO; yyerror("unexpected charater");}
    %%

    int yywrap(void){return 1;}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行 lex filename.l 时出现
以下错误

filename.l:16: EOF encountered inside an action
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到任何错误

lex

7
推荐指数
1
解决办法
1万
查看次数