- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将浮点功能添加到这个我用 C 语言编写的简单词法分析器中,用于 C(除其他外)。我对此有一些想法,但它们都是不完整的解决方案,主要涉及将 if 语句添加到 Parse 整数文字中,但由于 while 语句,它仍然会停止并将句点计为句点。我考虑过在那个 while 语句中添加一个 OR,但我不完全确定如何指定它只是一个句点。这是代码:
/* front.c */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
/*Global Declarations */
/*variables*/
int charClass;
char lexeme [100];
char nextChar;
int lexLen;
int token;
int nextToken;
FILE *in_fp, *fopen();
/*function declarations*/
void addChar();
void getChar();
void getNonBlank();
int lex();
/*Character classes */
#define LETTER 0
#define DIGIT 1
#define UNKNOWN 99
/*token codes*/
#define INT_LIT 10
#define FLOAT
#define IDENT 11
#define ASSIGN_OP 20
#define ADD_OP 21
#define SUB_OP 22
#define MULT_OP 23
#define DIV_OP 24
#define LEFT_PAREN 25
#define RIGHT_PAREN 26
#define MOD_OP 27
#define SEMICOL 28
#define COMMA 29
#define EXCLAMATION_MARK 30
#define AT_SIGN 31
#define POUND_SIGN 32
#define DOLLAR_SIGN 33
#define CARAT_SIGN 34
#define AMPERSAND 35
#define PERIOD_MARK 36
#define LESSTHAN_SIGN 37
#define GREATERTHAN_SIGN 38
#define QUESTION_MARK 39
#define LEFT_SQUAREBRACKET 40
#define RIGHT_SQUAREBRACKET 41
#define LEFT_CURLYBRACKET 42
#define RIGHT_CURLYBRACKET 43
#define BACKSLASH 44
#define VERTICALBAR 45
#define SINGLE_QUOTE 46
#define DOUBLE_QUOTE 47
#define COLON 48
#define UNDERSCORE 49
#define TILDE 50
#define GRAVE_ACCENT 51
/*********************/
/*main driver */
main()
{
/*Open the input data file and process its contents*/
if ((in_fp = fopen("front.in", "r")) == NULL)
printf("ERROR - cannot open front.in \n");
else
{
getChar();
do
{
lex();
} while (nextToken != EOF);
}
}
/***************************/
/*lookup - a function to lookup operators and parentheses
and return the token */
int lookup(char ch)
{
switch (ch)
{
case '=':
addChar();
nextToken = ASSIGN_OP
break;
case '(':
addChar();
nextToken = LEFT_PAREN;
break;
case ')':
addChar();
nextToken = RIGHT_PAREN;
break;
case '+':
addChar();
nextToken = ADD_OP;
break;
case '-':
addChar();
nextToken = SUB_OP;
break;
case '*':
addChar();
nextToken = MULT_OP;
break;
case '/':
addChar();
nextToken = DIV_OP;
break;
case '%':
addChar();
nextToken = MOD_OP;
break;
case ';':
addChar();
nextToken = SEMICOL;
break;
case ':':
addChar();
nextToken = COLON;
break;
case '"':
addChar();
nextToken = DOUBLE_QUOTE;
break;
case ',':
addChar();
nextToken = COMMA;
break;
case '.':
addChar();
nextToken = PERIOD_MARK;
break;
case '!':
addChar();
nextToken = EXCLAMATION_MARK;
break;
case '@':
addChar();
nextToken = AT_SIGN;
break;
case '#':
addChar();
nextToken = POUND_SIGN;
break;
case '$':
addChar();
nextToken = DOLLAR_SIGN;
break;
case '^':
addChar();
nextToken = CARAT_SIGN;
break;
case '&':
addChar();
nextToken = AMPERSAND;
break;
case '<':
addChar();
nextToken = LESSTHAN_SIGN;
break;
case '>':
addChar();
nextToken = GREATERTHAN_SIGN;
break;
case '?':
addChar();
nextToken = QUESTION_MARK;
break;
case '[':
addChar();
nextToken = LEFT_SQUAREBRACKET;
break;
case ']':
addChar();
nextToken = RIGHT_SQUAREBRACKET;
break;
case '{':
addChar();
nextToken = LEFT_CURLYBRACKET;
break;
case '}':
addChar();
nextToken = RIGHT_CURLYBRACKET;
break;
case '\'':
addChar();
nextToken = SINGLE_QUOTE;
break;*
case '|':
addChar();
nextToken = VERTICALBAR;
break;
case '_':
addChar();
nextToken = UNDERSCORE;
break;
case '~':
addChar();
nextToken = TILDE;
break;
case '`':
addChar();
nextToken = GRAVE_ACCENT;
break;
case '\\':
addChar();
nextToken = BACKSLASH;
break;
default:
addChar();
nextToken = EOF;
break;
}
return nextToken;
}
/*****************************/
/* addChar = a function to add nextChar to lexeme */
void addChar()
{
if (lexLen <= 98)
{
lexeme[lexLen++] = nextChar;
lexeme[lexLen] = 0;
}
else
printf("Error - lexeme is too long \n");
}
/**********************************/
/* getChar- a function to get the next character of
input and determine its character class */
void getChar()
{
if ((nextChar = getc(in_fp)) != EOF)
{
if (isalpha(nextChar))
charClass = LETTER;
else if (isdigit(nextChar))
charClass = DIGIT;
else charClass = UNKNOWN;
}
else
charClass = EOF;
}
/********************************************/
/* getNonBlank - a function to call getChar until it
returns a non-whitespace character */
void getNonBlank()
{
while (isspace(nextChar))
getChar();
}
/*******************************/
/* lex - a simple lexical analyzer for arithmetic
expressions */
int lex()
{
lexLen = 0;
getNonBlank();
switch (charClass)
{
/*Parse identifiers */
case LETTER:
addChar();
getChar();
while (charClass == LETTER || charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = IDENT;
break;
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = INT_LIT;
break;
/*Parentheses and operators*/
case UNKNOWN:
lookup(nextChar);
getChar();
break;
/*EOF*/
case EOF:
nextToken = EOF;
lexeme[0] = 'E';
lexeme[1] = 'O';
lexeme[2] = 'F';
lexeme[3] = 0;
break;
}/*End of switch*/
printf("Next token is: %d, Next lexeme is %s\n",
nextToken, lexeme);
return nextToken;
} /*End of function lex*/
我在想,也许如果我在 while 语句中使用像“charClass.ch == '.'”这样的东西作为“charClass == DIGIT”的扩展,通过 || (或),但我认为我可能会与另一种语言混淆或做错了。我可能不是,但目前很难正确测试这个程序。
这是我认为需要更改以获得 float 的具体部分:
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = INT_LIT;
break;
最佳答案
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
此时您已经知道nextChar
是什么了。如果它是一个点,请编写更多代码来使用它和所有后续数字并将 nextToken
设置为 FLOAT_LIT。
否则会落入此:
nextToken = INT_LIT;
break;
关于c - 如何向 C 词法分析器添加浮点解析功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623796/
我最近开始使用 Scala 编程。我正在寻找免费的 Scala 分析器。从该语言的官方网站阅读后,我找到了 YourKit ,但该程序不是免费的。 谷歌搜索“scala profiler”没有给我任何
是否有一个程序可以让我获得有关脚本的详细信息:具体来说,我希望能够跟踪其内存占用情况并查看内存中有多少对象。 Firebug 有一个分析器,似乎可以提供计时信息,但我对内存管理更感兴趣。 最佳答案 G
Erlang 有没有好的代码分析器/分析器?我需要一些可以为我的代码构建调用图的东西。 最佳答案 对于静态代码分析,您有 Xref和 Dialyzer ,对于分析,您可以使用 cprof、fprof
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
什么是“self”和“total”列? “总计”列加起来不等于 100%(高得多),看起来像 self 一样。我怀疑 self 是非累积的,而 total 是。因此,如果 methodA 调用 met
在 Perl 中,有一个非常好的分析器,称为 NYTProf。 在其报告中包含 flame graph ,这样就很容易找到程序的瓶颈 是否有一个等效的 java profiler 可以生成相同的报告?
我想知道是否有办法在c++程序中查看特定部分的调用路径。我在开源代码中工作,其中包含许多库。我尝试按照最终在模板中的路径中的代码进行操作。那么,是否有这样的库或分析器来显示代码特定部分的调用路径? 谢
我正在寻找支持每个请求分析统计的分析器,最好是沿着程序流(而不是通常的线程调用堆栈)。所以基本上是每个请求的探查器调用堆栈 + 顺序调用 View ,如下所示: doGet
如何让 symfony profiler 在 phpstorm 中工作?它应该在状态栏中,但是当我打开那个窗口时,它总是说:“这里什么都没有”。缓存目录在配置中正确定义,symfony 插件本身工作正
人们在 Unix 中用来解析/分析日志文件的流行工具是什么?进行计数,查找唯一性,选择/复制具有特定模式的特定行。请提供一些工具或一些关键字。因为我相信以前肯定有类似的问题,但我对关键字一无所知。谢谢
我设置了一个过滤器来计算执行的查询数量,并在超过某个限制时将一些内容写入我的数据库。 它在我的开发环境中运行良好,但是当我在生产环境中测试它时,我的数据库不再返回分析器。我认为这是一个为开发环境启用数
你找到这样的工具并成功使用了吗? 最佳答案 我也在寻找 AS 的分析器,但我想要一个与 FlashDevelop 和 Flex SDK 配合使用的免费软件/开源解决方案。我没有找到。所以我写了一个简单
我需要扩展 SonarQube,以便我可以向其中添加新的分析器。我尝试使用 xpath 为 java 文件添加新规则。我想知道如何在 SonarQube 中添加新语言的代码分析器,例如对于 .meta
我可以在C#(嵌套)中使用elasticsearch 2.3.0版本 我想将分析与索引一起使用, 但是索引设置不会改变,我也不知道为什么。 这是我的代码: private void b
我有一个正在wireshark中查看的自定义协议(protocol)。我认为如果wireshark可以帮我剖析它,这样我就不必解码十六进制了,这会很有用。尽管我在程序日志中执行此操作,但wiresha
我正在考虑使用 Elasticsearch 来提供我们网站的搜索功能。 我一直在试验它,但无法启用 Porterstem 分析器(以便搜索战斗匹配战斗和战斗)。 这是我输入的摘要。 curl
我正在尝试运行一个基于java的java分析器来找出我的专用机器上的java应用程序的资源消耗情况。我尝试使用的分析器称为 Warmroast。 运行时出现以下错误。 java -jar warmro
我没有从我的分析器获得预期结果,并且想测试标记化过程。 此问题的答案:How to use a Lucene Analyzer to tokenize a String? List result =
我在 Lucene 中有特殊的分析需求,但我想继续使用 StandardAnalyzer 机制的部分内容。 特别是,我想要字符串 “-苹果--胡萝卜-番茄?” 被标记为: “-苹果-”2.“-胡萝卜-
有什么好的 JSF 分析器推荐吗? 我正在使用 Tomcat 6 JSF2、 hibernate 和 Spring 最佳答案 如果您使用的是 Eclipse 或 Netbeans 之类的 IDE,那么
我是一名优秀的程序员,十分优秀!