这是交易.有没有办法让基于多个正则表达式的行中的字符串标记?
一个例子:
我必须根据不同的正则表达式获取所有href标签,相应的文本和其他一些文本.所以我有3个表达式,并且想要对行进行标记并提取与每个表达式匹配的文本标记.
我实际上是使用flex完成的(不要与Adobe混淆),这是一个很好的老lex的实现.lex通过基于表达式执行"actions"来提供一种优雅的方法.人们也可以控制lex读取文件的方式(基于块/行的读取).
问题是flex实际上产生的C/C++代码实际上是标记化工作.我有一个包含所有这些东西的make文件.我想知道perl/python是否能以某种方式做同样的事情.它只是我想用一种编程语言本身做我喜欢的一切.
令牌化只是我想要在我的应用程序中执行的操作之一.
除了perl或python之外,任何语言(功能也可以)都可以这样做吗?
我在这里读过关于PLY和ANTLR的内容(解析,我在哪里可以了解它).
但有没有办法在python本身自然地做到这一点?请原谅我的无知,但这些工具是否适用于任何受欢迎的产品/服务?
谢谢.
我试图找出在使用lex/yacc(flex/bison)时如何显示消息/提示.
例如,main看起来像这样:
int main(int argc, char *argv[])
{
yyparse();
}
Run Code Online (Sandbox Code Playgroud)
其中调用yacc,调用yylex().这会产生一个等待STDIN的空白行.我怎样才能显示如...的消息
message $ _
代替
_
下划线表示光标位置,等待STDIN的输入......
忘了提,我想重复打印的提示......所以在每次lex/yacc请求从stdin输入之前...
R有这样的解析工具吗?它不一定是我的案例的lex/yacc兼容工具.
(我是R新手)
编辑:我对使用R实现另一种语言感兴趣
我有以下语法:
rule: 'aaa' | 'a' 'a';
Run Code Online (Sandbox Code Playgroud)
它可以成功解析字符串'aaa',但它无法解析'aa'并出现以下错误:
line 1:2 mismatched character '<EOF>' expecting 'a'
Run Code Online (Sandbox Code Playgroud)
仅供参考,这是词法分析器的问题而不是解析器,因为我甚至没有调用解析器.主要功能如下:
@members {
public static void main(String[] args) throws Exception {
RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
System.out.println(t.getType());
}
}
Run Code Online (Sandbox Code Playgroud)
结果与更明显的版本相同:
rule: AAA | A A;
AAA: 'aaa';
A: 'a';
Run Code Online (Sandbox Code Playgroud)
显然,ANTLR词法分析器尝试将输入'aa'与失败的规则AAA匹配.除了ANTLR是一个LL(*)解析器或其他什么,词法分析器应该与解析器分开工作,它应该能够解决歧义.语法在良好的旧lex(或flex)下运行良好,但在ANTLR中似乎没有.那么这里的问题是什么?
谢谢您的帮助!
我想在 my 中使用YY_BUFFER_STATE yy_scan_string(const char *str)和其他功能,我做了以下事情:yyparse()main.cpp
extern "C"{
extern YY_BUFFER_STATE yy_scan_string(const char *str);
}
Run Code Online (Sandbox Code Playgroud)
但是有一个错误error:YY_BUFFER_STATE' does not name a type`,然后我做了:
extern yy_buffer_state;
typedef yy_buffer_state *YY_BUFFER_STATE;
extern int yyparse();
extern YY_BUFFER_STATE yy_scan_buffer(char *, size_t);
Run Code Online (Sandbox Code Playgroud)
但是同样的问题,怎么办,谢谢,非常感谢您的帮助!!
这是 main.cpp 文件。#include "main.h"
#include <string.h>
extern "C"{void scan_string(const char* str);}
int yyparse();
void test::getvalue(int& var)
{
if (var!=0)
std::cout<<"True"<<std::endl;
else
std::cout<<"False"<<std::endl;
}
int main(){
std::string str="T+F";
//how to send str as an Input to parse?
yyparse();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我是flex和bison的新手,我现在已经在这个项目上工作了几天.我有一个以前工作正常的野牛文件,我改变了一点,现在它没有创建一个tab.h文件...我已经将错误和我的野牛和flex文件放在下面...错误:
In file included from stojk_3_2.y:55:
stojkovic_project1_2.l:4:27: error: stojk_3_2.tab.h: No such file or directory
stojk_3_2.tab.c: In function ‘int yyparse()’:
stojk_3_2.tab.c:1416: warning: deprecated conversion from string constant to ‘char*’
stojk_3_2.tab.c:1562: warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)
.y文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define YYSTYPE double
int yylex(void);
static
void yyerror(char *s)
{
printf("yyerror: %s\n", s);
}
%}
%token PLUS
%token MINUS
%token MULT
%token DIVIDE
%token LPAREN
%token RPAREN
%token UNSIGNEDINTEGER
%left PLUS MINUS
%left MULT DIVIDE …Run Code Online (Sandbox Code Playgroud) 我正在学习正则表达式,以便在lex程序中使用它们.我在这里看到,在正则表达式中:
'*' matches 0 or more occurances of pattern
'?' matches 0 or 1 occurance of the pattern
通过这个我有点困惑.我的意思是:
FL [0-9]*"."[0-9]+ FL [0-9]?"."[0-9]+对于0.999或.999等数字(即,在小数点之前只有一位数的数字.)?任何人都可以解释一下吗?提前感谢你:).
我是lex和yacc以及编译器设计的新手.我想知道在哪个阶段(词法,句法或任何其他阶段)以及如何生成符号表?
我是否可以简要描述y.output文件,该文件是通过给yacc提供-v选项生成的.我试图查看它但没有得到太多信息.
我能否知道除了编译器设计之外还使用lex和yacc的其他应用程序.
我试图运行PLY的一个简单例子的第一部分,但我遇到了一个奇怪的错误.当我运行以下代码时,它给我一个关于lex.lex()的错误任何人都知道问题是什么?
import ply.lex as lex
tokens = [ 'NAME','NUMBER','PLUS','MINUS','TIMES', 'DIVIDE', 'EQUALS' ]
t_ignore = '\t'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
lex.lex() # Build the lexer
Run Code Online (Sandbox Code Playgroud)
这是错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-e527bd224769> in <module>()
14 return t
15
---> 16 ply.lex.lex() # Build the lexer
c:\python27\lib\site-packages\ply\lex.pyc in lex(module, object, debug, optimize, lextab, reflags, nowarn, outputdir, debuglog, errorlog) …Run Code Online (Sandbox Code Playgroud) I looked ANSI C grammar (lex).
And this is octal digit regex
0{D}+{IS}? { count(); return(CONSTANT); }
Run Code Online (Sandbox Code Playgroud)
My question is why do they accept something like 0898?
It's not an octal digit.
So i thought they would consider that, but they just have wrote like that.
Could you explain why is that? Thank you