Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何用C+解析整数/标识符/字符串/运算符+;11正则表达式?_Regex_C++11_Parsing_Pattern Matching_Tokenize - Fatal编程技术网

Regex 如何用C+解析整数/标识符/字符串/运算符+;11正则表达式?

Regex 如何用C+解析整数/标识符/字符串/运算符+;11正则表达式?,regex,c++11,parsing,pattern-matching,tokenize,Regex,C++11,Parsing,Pattern Matching,Tokenize,我有一个非常简单的脚本语言gramma: compilationUnit : ( variable | print )* EOF; variable : LET ID EQUALS value; print : PRINT ( ID ) ; value : INTEGER | STRING ; // tokens LET : 'let' ; PRINT : 'print' ; EQUALS : '=' ; INTEGER : [0-9]+ ; STRING : '"'.*'"' ;

我有一个非常简单的脚本语言gramma:

compilationUnit : ( variable | print )* EOF;
variable : LET ID EQUALS value;
print : PRINT ( ID ) ;
value : INTEGER
      | STRING ;

// tokens
LET : 'let' ;
PRINT : 'print' ;
EQUALS : '=' ;
INTEGER : [0-9]+ ;
STRING : '"'.*'"' ;
ID : [a-zA-Z0-9]+ ;
OPERATOR : ==|!=|<|<=|>|>=|+|-|*|/|% ;
WS: [ \t\n\r]+ -> skip ;
如何用C++11正则表达式解析整数/标识符/字符串/运算符


我的正则表达式模式似乎不正确:
”([0-9]+)|[A-Z_A-Z][A-Z_A-z0-9]*|=|=|=|=|!=|=“

我不熟悉C++11,但我发现您的模式可能存在以下几个问题:

1) 您的paren仅包装Order集合的第一个标记—将标记移到模式的末尾,或将其完全移除。如果要查找实际的括号字符,请将其转义到它们所在的位置。(通常带有前面的反斜杠\)

2) 检查编译器关于reg ex处理的规则。如果C++11支持“贪婪”匹配,请使用它——这将始终使用它所能使用的最大匹配。或者,如果处理器使用从左到右的顺序,请更改模式,将多字符运算符放在单字符运算符(==BEFORE=,…)之前,否则较短的标记将匹配并中断其余标记

3) !!在reg ex模式中具有特殊含义,请退出该模式;<而且>也可能需要逃跑

4) 您的OR标记字符串应该用方括号括起来

我会尝试:

   [[0-9]+|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>]
[[0-9]+|[A-Z\u A-Z][A-Z\u A-z0-9]*|==|\!=|\=|=|
或者(如果需要反向引用)

([0-9]+|[A-Z\u A-Z][A-Z\u A-z0-9]*|==|\!=|\=|=|\])
或者(如果在ID中查找实际参数)

[\([0-9]+\)[A-Z\u A-Z][A-Z\u A-z0-9]*|===|\!=|\=|

<> >:强>买方谨防< /St>>我知道C、C++和C++,但不知道C++ 11标准的细节。我可能完全错了。:-)

设z=x+y在语法中不是有效的句子;语法不允许
+
。也不是打印(x==y)
。实际上,
运算符已定义,但从未在任何生产中实际使用,因此不能出现在格式良好的
编译单元中
字符串
声称允许引号之间的任何字符,但是当这个字符本身就是一个引号的时候,你似乎没有做任何准备。是什么让你相信你的模式是不对的?你如何使用它,你期望得到什么结果,你观察到了什么?显示一个。@IgorTandetnik,解决了这个问题<代码>+应该在
操作符中。
   [[0-9]+|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>]
   ([[0-9]+|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>])
   [\([0-9]+\)|[A-Z_a-z][A-Z_a-z0-9]*|==|\!=|\<=|\>=|=|\<|\>]