小编ric*_*ici的帖子

如何将flex lexical scanner生成器用作程序的一部分?

我如何使用我使用Flex编写的扫描仪作为我正在设计的程序的一部分?具体来说,在一个c ++类中作为一个类的方法,并从一个单独的文件中只用一个main方法来执行测试.

我不想使用%选项c ++,但会用g ++编译.

要回答如何从单独的文件主要测试扫描仪的问题,我尝试使用以下代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

extern "C" {
    extern int yylex();
}

extern FILE* yyin;

int main(int argc, char *argv[]) {
    if (argc > 1)
        yyin = fopen(argv[1], "r");
    yylex();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我这样编译:

flex mylexer.l++
g++ lex.mylexer.C myDriver.C -o myLexer
Run Code Online (Sandbox Code Playgroud)

我明白了:

对yyin的未定义引用

对yylex的未定义引用

编译/设置驱动程序文件的正确方法是什么?感谢您阅读和贡献任何东西!

c c++ linux lex flex-lexer

5
推荐指数
1
解决办法
7920
查看次数

如何使lex/flex识别不被空格分隔的标记?

我正在学习编译器构建课程,目前的任务是为我们正在实现的语言编写词法分析器.我无法弄清楚如何满足词法分析器必须识别连接标记的要求.也就是说,令牌没有被空格分隔.例如:字符串39if应该被识别为数字39和关键字if.同时,词法分析器也必须exit(1)在遇到无效输入时.

我的代码的简化版本:

%{
#include <stdio.h>
%}

%option main warn debug

%%

if      |
then    |
else    printf("keyword: %s\n", yytext);

[[:digit:]]+    printf("number: %s\n", yytext);

[[:alpha:]][[:alnum:]]*     printf("identifier: %s\n", yytext);

[[:space:]]+    // skip whitespace
[[:^space:]]+   { printf("ERROR: %s\n", yytext); exit(1); }

%%
Run Code Online (Sandbox Code Playgroud)

当我运行它(或我的完整版本),并将输入传递给它时39if,错误规则匹配,输出是ERROR: 39if,当我希望它是:

number: 39
keyword: if
Run Code Online (Sandbox Code Playgroud)

(就像我输入的39 if那样.)

通过手册,我有一个预感,原因是错误规则匹配比数字和关键字规则更长的输入,而flex会更喜欢它.那就是说,我不知道如何解决这种情况.编写一个拒绝所有非错误输入的显式正则表达似乎是不可行的,我不知道如何为了处理词法错误而编写"全能"规则.

更新:我想我可以制定全能规则,. { exit(1); }但我希望获得一些比"我在第1行上感到困惑"更好的调试输出.

compiler-construction parsing lex lexer

5
推荐指数
1
解决办法
6186
查看次数

Flex中的非贪婪正则表达式匹配

我刚刚开始使用Flex,似乎无法弄清楚如何匹配以下Expression:

"Dog".*"Cat"
------------------
Input :
Dog Ca Cat Cc Cat
------------------
Output:
Dog Ca Cat Cc Cat
Run Code Online (Sandbox Code Playgroud)

但是我想要一个非贪心的匹配,并带有以下输出:

Output:
Dog Ca Cat
Run Code Online (Sandbox Code Playgroud)

如何在Flex上实现?

编辑

尝试了以下内容:

%%
Dog.*Cat/.*Cat  printf("Matched : ||%s||", yytext);
dog.*cat        printf("Matched : ||%s||", yytext);
dOg[^c]*cAt     printf("Matched : ||%s||", yytext);
DOG.*?CAT       printf("Matched : ||%s||", yytext);
%%
Run Code Online (Sandbox Code Playgroud)

输入:

Dog Ca Cat Cc Cat
dog Ca cat Cc cat
dOg Ca cAt Cc cAt
DOG CA CAT CC CAT
Run Code Online (Sandbox Code Playgroud)

输出:

Matched : ||Dog Ca Cat Cc Cat||
Matched : ||dog Ca …
Run Code Online (Sandbox Code Playgroud)

regex lex flex-lexer

5
推荐指数
1
解决办法
1699
查看次数

Xcode 无法自动完成 Swift 中的 Parse 函数

我正在尝试构建一个使用 Parse 的 Swift 编写的应用程序,但我意识到我的 Xcode 不再为任何 Parse 函数提供自动完成功能。该应用程序仍然可以在 iOS 模拟器上毫无问题地编译和构建,因此我知道框架正在正确读取/编译,但在无法使用自动完成功能的情况下进行开发非常令人沮丧,特别是因为 API 参考还没有 Swift代码。

对于我当前的项目,我将 pod Parse 添加到我的 Podfile 中,从而以这种方式添加了 sdk。我还按照此处的说明进行操作:http://blog.parse.com/2014/06/06/building-apps-with-parse-and-swift/创建一个Appname-Bridging-Header.h文件,并#import <Parse/Parse.h>在其中添加以导入头文件。所以我不确定问题是什么。

xcode autocomplete parse-platform swift

5
推荐指数
1
解决办法
1821
查看次数

如何在Parse中集成5个以上的推送证书?

我正在尝试在Parse中为每个应用程序集成推送通知构建5个以上的应用程序.但解析是将推送证书限制为5.有没有办法解决这个问题?

push push-notification ios parse-platform

5
推荐指数
1
解决办法
319
查看次数

如何使用 yacc 解析器检测错误行号

我们不知道如何跟踪 yacc 解析器中的错误。yylineno我们尝试在 lex 文件中使用并尝试添加%option yylineno,但它仍然不起作用,我们无法在 yacc 中访问这些变量。

error我们想要的只是使用yacc 和行号打印出语法错误。

这是我们的.l文件

%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
int yylineno=1;

%}

%option yylineno

identifier  [a-zA-Z_][a-zA-Z0-9_]*
int_constant    [0-9]+
delimiter       ;

%%

"int"       {return INT;}
{int_constant}  return INT_CONST;
{identifier}    return IDENT;
\=      {return ASOP;}
\+      {return PLUS;}
\-      {return MINUS;}
\*      {return MULT;}
\/      {return DIV;}
\,      {return COMMA;}
\(      {return OP;} /*OP CP = Opening Closing Parenthesis*/
\)      {return CP;}
\[      {return OB;} /*OB …
Run Code Online (Sandbox Code Playgroud)

yacc lex bison

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

算法 - 区分一组给定二进制数的最小位数

假设我们给出了K不同的二进制数,每个都有长度N(N可以很大).是否有一种有效的算法来确定将这些数字相互区分所需的最小位数?

例如:

给定110011,我们只需要检查第一个(或最后一个)位来区分它们,所以最小数量是1.

鉴于1000,0100,00100001,我们需要检查至少三位来区分,所以最少数量为3.

鉴于0000,0100,10001100,我们只需要检查的前两位,因此最小号码是2.

后续:输出要检查的相应索引.


编辑:假设这些二进制数表示为,...,.这个问题相当于找到最小的子序列,以便...,是不同的数字.a1[0,1,…,N-1]aK[0,1,…,N-1][i,j,…,m][0,1,…,N-1]a1[i,j,…,m]aK[i,j,…,m]

algorithm

5
推荐指数
1
解决办法
1317
查看次数

解析架构冻结

我已经开始使用parse-server npm模块了.

一切都很好,但是当我尝试使用REST请求在新类中实例化新对象时,我得到以下响应:

{"code":107,"error":"schema is frozen, cannot add: AccountTest2"}
Run Code Online (Sandbox Code Playgroud)

我试过谷歌搜索这个问题,但我真的没有看到任何结果.

谢谢!

parse-server

5
推荐指数
1
解决办法
142
查看次数

使用awk计算时间差

我有以下 input.txt 文件。我需要计算 2 美元和 3 美元的时间差并以小时为单位打印差值。

P1,       2016-05-30 00:11:20,    2016-05-30 04:36:40
P2,       2016-05-30 00:07:20,    2016-05-30 04:32:31
Run Code Online (Sandbox Code Playgroud)

我有以下代码,但看起来时间显示不准确。请帮忙。

awk -F, '{gsub(/[-:]/," ",$2);gsub(/[-:]/," ",$3);
          d2=mktime($3);d1=mktime($2);
          print $1","(d2-d1)/3600,"hrs";}' input.txt
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出。

P1,4.42222 hrs
P2,4.41972 hrs
Run Code Online (Sandbox Code Playgroud)

但应该显示出差异 4:25:20 小时 4:25:11 小时

提前致谢

bash shell awk

5
推荐指数
1
解决办法
3740
查看次数

GCC会产生无用的指令吗?

BOOL32 doStuff() {
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

对于vxworks 5.x,gcc 2.95,使用-O0以下代码生成的32位x86 编译上述代码:

          doStuff:
0e9de190:   push    %ebp
0e9de191:   mov     %esp,%ebp
 308          return TRUE;
0e9de193:   mov     $0x1,%eax
0e9de198:   jmp     0xe9de1a0 <doStuff+16>
 312      {
0e9de19a:   lea     0x0(%esi),%esi
// The JMP jumps here
0e9de1a0:   mov     %ebp,%esp
0e9de1a2:   pop     %ebp
0e9de1a3:   ret
Run Code Online (Sandbox Code Playgroud)

在JMP和LEA指令之前,一切看起来都很正常.它们适用于什么?


我的猜测是它是某种对齐,但我不确定这一点.

我会做这样的事情:

          doStuff:
0e9de190:   push    %ebp
0e9de191:   mov     %esp,%ebp
 308          return TRUE;
0e9de193:   mov     $0x1,%eax
0e9de1XX:   mov     %ebp,%esp
0e9de1XX:   pop     %ebp
0e9de1XX:   ret
0e9de1XX:   fill with lea 0x0, %esi
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc reverse-engineering

5
推荐指数
1
解决办法
176
查看次数