我如何使用我使用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的未定义引用
编译/设置驱动程序文件的正确方法是什么?感谢您阅读和贡献任何东西!
我正在学习编译器构建课程,目前的任务是为我们正在实现的语言编写词法分析器.我无法弄清楚如何满足词法分析器必须识别连接标记的要求.也就是说,令牌没有被空格分隔.例如:字符串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行上感到困惑"更好的调试输出.
我刚刚开始使用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) 我正在尝试构建一个使用 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>在其中添加以导入头文件。所以我不确定问题是什么。
我正在尝试在Parse中为每个应用程序集成推送通知构建5个以上的应用程序.但解析是将推送证书限制为5.有没有办法解决这个问题?
我们不知道如何跟踪 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) 假设我们给出了K不同的二进制数,每个都有长度N(N可以很大).是否有一种有效的算法来确定将这些数字相互区分所需的最小位数?
例如:
给定110和011,我们只需要检查第一个(或最后一个)位来区分它们,所以最小数量是1.
鉴于1000,0100,0010和0001,我们需要检查至少三位来区分,所以最少数量为3.
鉴于0000,0100,1000和1100,我们只需要检查的前两位,因此最小号码是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]
我已经开始使用parse-server npm模块了.
一切都很好,但是当我尝试使用REST请求在新类中实例化新对象时,我得到以下响应:
{"code":107,"error":"schema is frozen, cannot add: AccountTest2"}
Run Code Online (Sandbox Code Playgroud)
我试过谷歌搜索这个问题,但我真的没有看到任何结果.
谢谢!
我有以下 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 小时
提前致谢
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)