将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

2024-03-18

我对 Xtext 和 ANTLR 都很陌生。

我需要将 ANTLR (.g) 语法转换为 XTEXT (.xtext) 语法。在 ANTLR 语法中,存在 Xtext 不支持的语法谓词。

有没有办法删除/翻译这些谓词?

Thanks

EDIT

我尝试翻译的 ANTLR 语法可以在这里找到:

/*
 * Copyright 2009, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// This file contains the ANTLR grammar for parsing GLSL ES into an Abstract
// Syntax Tree (AST).

grammar GLSL_ES;

options {
    language = Java;
}

@lexer::header  { package glsl_es; }
@parser::header { package glsl_es; }

/* Main entry point */
translation_unit
  : ( external_declaration )* EOF
  ;

variable_identifier
  : IDENTIFIER
  ;

primary_expression
  : INTCONSTANT
  | FLOATCONSTANT
  | BOOLCONSTANT
  | variable_identifier
  | LEFT_PAREN expression RIGHT_PAREN
  ;

postfix_expression
  : primary_expression_or_function_call
    ( LEFT_BRACKET integer_expression RIGHT_BRACKET
      | DOT field_selection
      | INC_OP
      | DEC_OP
    )*
  ;

primary_expression_or_function_call
  : ( INTCONSTANT ) => primary_expression
  | ( FLOATCONSTANT ) => primary_expression
  | ( BOOLCONSTANT ) => primary_expression
  | ( LEFT_PAREN ) => primary_expression
  | ( function_call_header ) => function_call
  | primary_expression
  ;

integer_expression
  : expression
  ;

function_call
  : function_call_generic
  ;

function_call_generic
  : function_call_header
    (
        (VOID)?
      | assignment_expression (COMMA assignment_expression)*
    )
    RIGHT_PAREN
  ;

function_call_header
  : function_identifier LEFT_PAREN
  ;

// NOTE: change compared to GLSL ES grammar, because constructor_identifier
// has IDENTIFIER (=TYPE_NAME) as one of its arms.
function_identifier
  : constructor_identifier
//  | IDENTIFIER
  ;

// Grammar Note: Constructors look like functions, but lexical analysis recognized most of them as 
// keywords.
//
// TODO(kbr): do we need to register declared struct types in a dictionary
// and look them up in order to be able to handle the TYPE_NAME constructor
// identifier type?

constructor_identifier
  : FLOAT
  | INT
  | BOOL
  | VEC2
  | VEC3
  | VEC4
  | BVEC2
  | BVEC3
  | BVEC4
  | IVEC2
  | IVEC3
  | IVEC4
  | MAT2
  | MAT3
  | MAT4
//  | TYPE_NAME
  | IDENTIFIER
  ;

unary_expression
  : (INC_OP | DEC_OP | unary_operator)* postfix_expression
  ;

// Grammar Note:  No traditional style type casts. 

unary_operator
  : PLUS
  | DASH
  | BANG
//| TILDE   // reserved
  ;

// Grammar Note:  No '*' or '&' unary ops.  Pointers are not supported. 

multiplicative_expression
  : unary_expression ((STAR | SLASH) unary_expression)*
//| multiplicative_expression PERCENT unary_expression   // reserved
  ;

additive_expression
  : multiplicative_expression ((PLUS | DASH) multiplicative_expression)*
  ;

shift_expression
  : additive_expression
//| shift_expression LEFT_OP additive_expression         // reserved
//| shift_expression RIGHT_OP additive_expression        // reserved
  ;

relational_expression
  : shift_expression ((LEFT_ANGLE | RIGHT_ANGLE | LE_OP | GE_OP) shift_expression)*
  ;

equality_expression
  : relational_expression ((EQ_OP | NE_OP) relational_expression)*
  ;

and_expression
  : equality_expression
//| and_expression AMPERSAND equality_expression         // reserved
  ;

exclusive_or_expression
  : and_expression
//| exclusive_or_expression CARET and_expression         // reserved
  ;

inclusive_or_expression
  : exclusive_or_expression
//| inclusive_or_expression VERTICAL_BAR exclusive_or_expression  // reserved
  ;

logical_and_expression
  : inclusive_or_expression (AND_OP inclusive_or_expression)*
  ;

logical_xor_expression
  : logical_and_expression (XOR_OP logical_and_expression)*
  ;

logical_or_expression
  : logical_xor_expression (OR_OP logical_xor_expression)*
  ;

conditional_expression
  : logical_or_expression (QUESTION expression COLON assignment_expression)?
  ;

assignment_expression
  : (unary_expression assignment_operator) => unary_expression assignment_operator assignment_expression
  | conditional_expression
  ;

assignment_operator
  : EQUAL
  | MUL_ASSIGN
  | DIV_ASSIGN
//| MOD_ASSIGN   // reserved
  | ADD_ASSIGN
  | SUB_ASSIGN
//| LEFT_ASSIGN  // reserved
//| RIGHT_ASSIGN // reserved
//| AND_ASSIGN   // reserved
//| XOR_ASSIGN   // reserved
//| OR_ASSIGN    // reserved
  ;

expression
  : assignment_expression (COMMA assignment_expression)*
  ;

constant_expression
  : conditional_expression
  ;

declaration
  : (function_header) => function_prototype SEMICOLON
  | init_declarator_list SEMICOLON
  | PRECISION precision_qualifier type_specifier_no_prec SEMICOLON
  ;

function_prototype
  : function_declarator RIGHT_PAREN
  ;

function_declarator
  : function_header (parameter_declaration (COMMA parameter_declaration)* )?
  ;

function_header
  : fully_specified_type IDENTIFIER LEFT_PAREN
  ;

parameter_declaration
  : (type_qualifier)? (parameter_qualifier)?
    ( type_specifier
      // parameter_declarator
      (IDENTIFIER)?
      // parameter_type_specifier
      (LEFT_BRACKET constant_expression RIGHT_BRACKET)?
    )
  ;

// NOTE: this originally had "empty" as one of the arms in the grammar

parameter_qualifier
  : IN
  | OUT
  | INOUT
  ;

init_declarator_list
  : single_declaration (init_declarator_list_1)*
  ;

init_declarator_list_1
  : COMMA IDENTIFIER (init_declarator_list_2)?
  ;

init_declarator_list_2
  : LEFT_BRACKET constant_expression RIGHT_BRACKET
  | EQUAL initializer
  ;

single_declaration
  : fully_specified_type
    ( IDENTIFIER
      (   LEFT_BRACKET constant_expression RIGHT_BRACKET
        | EQUAL initializer
      ) ?
    ) ?
  | INVARIANT IDENTIFIER   // Vertex only.
  ;

// Grammar Note:  No 'enum', or 'typedef'. 

fully_specified_type
  : type_specifier
  | type_qualifier type_specifier
  ;

type_qualifier
  : CONST
  | ATTRIBUTE   // Vertex only.
  | VARYING
  | INVARIANT VARYING
  | UNIFORM
  ;

type_specifier
  : type_specifier_no_prec
  | precision_qualifier type_specifier_no_prec
  ;

type_specifier_no_prec
  : VOID
  | FLOAT
  | INT
  | BOOL
  | VEC2
  | VEC3
  | VEC4
  | BVEC2
  | BVEC3
  | BVEC4
  | IVEC2
  | IVEC3
  | IVEC4
  | MAT2
  | MAT3
  | MAT4
  | SAMPLER2D
  | SAMPLERCUBE
  | struct_specifier
//  | TYPE_NAME
  | IDENTIFIER
  ;

precision_qualifier
  : HIGH_PRECISION
  | MEDIUM_PRECISION
  | LOW_PRECISION
  ;

struct_specifier
  : STRUCT (IDENTIFIER)? LEFT_BRACE struct_declaration_list RIGHT_BRACE
  ;

struct_declaration_list
  : (struct_declaration)+
  ;

struct_declaration
  : type_specifier struct_declarator_list SEMICOLON
  ;

struct_declarator_list
  : struct_declarator (COMMA struct_declarator)*
  ;

struct_declarator
  : IDENTIFIER (LEFT_BRACKET constant_expression RIGHT_BRACKET)?
  ;

initializer
  : assignment_expression
  ;

declaration_statement
  : declaration
  ;

statement_no_new_scope
  : compound_statement_with_scope
  | simple_statement
  ;

simple_statement
options { backtrack=true; }
  : declaration_statement
  | expression_statement
  | selection_statement
  | iteration_statement
  | jump_statement
  ;

compound_statement_with_scope
  : LEFT_BRACE (statement_list)? RIGHT_BRACE
  ;

statement_with_scope
  : compound_statement_no_new_scope
  | simple_statement
  ;

compound_statement_no_new_scope
  : LEFT_BRACE (statement_list)? RIGHT_BRACE
  ;

statement_list
  : (statement_no_new_scope)+
  ;

expression_statement
  : (expression)? SEMICOLON
  ;

selection_statement
options { backtrack=true; }
  : IF LEFT_PAREN expression RIGHT_PAREN statement_with_scope ELSE statement_with_scope
  | IF LEFT_PAREN expression RIGHT_PAREN statement_with_scope
  ;

condition
  : expression
  | fully_specified_type IDENTIFIER EQUAL initializer
  ;

iteration_statement
  : WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope
  | DO statement_with_scope WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON
  | FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope
  ;

for_init_statement
options { backtrack=true; }
  : expression_statement
  | declaration_statement
  ;

for_rest_statement
  : (condition)? SEMICOLON (expression)?
  ;

jump_statement
  : CONTINUE SEMICOLON
  | BREAK SEMICOLON
  | RETURN (expression)? SEMICOLON
  | DISCARD SEMICOLON   // Fragment shader only.
  ;

external_declaration
  : (function_header) => function_definition
  | declaration
  ;

function_definition
  : function_prototype compound_statement_no_new_scope
  ;

// ----------------------------------------------------------------------
// Keywords

ATTRIBUTE        : 'attribute';
BOOL             : 'bool';
BREAK            : 'break';
BVEC2            : 'bvec2';
BVEC3            : 'bvec3';
BVEC4            : 'bvec4';
CONST            : 'const';
CONTINUE         : 'continue';
DISCARD          : 'discard';
DO               : 'do';
ELSE             : 'else';
FALSE            : 'false';
FLOAT            : 'float';
FOR              : 'for';
HIGH_PRECISION   : 'highp';
IF               : 'if';
IN               : 'in';
INOUT            : 'inout';
INT              : 'int';
INVARIANT        : 'invariant';
IVEC2            : 'ivec2';
IVEC3            : 'ivec3';
IVEC4            : 'ivec4';
LOW_PRECISION    : 'lowp';
MAT2             : 'mat2';
MAT3             : 'mat3';
MAT4             : 'mat4';
MEDIUM_PRECISION : 'mediump';
OUT              : 'out';
PRECISION        : 'precision';
RETURN           : 'return';
SAMPLER2D        : 'sampler2D';
SAMPLERCUBE      : 'samplerCube';
STRUCT           : 'struct'; 
TRUE             : 'true';
UNIFORM          : 'uniform';
VARYING          : 'varying';
VEC2             : 'vec2';
VEC3             : 'vec3';
VEC4             : 'vec4';
VOID             : 'void';
WHILE            : 'while';

IDENTIFIER
  : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  ;

/*
// TODO(kbr): it isn't clear whether we need to support the TYPE_NAME
// token type; that may only be needed if typedef is supported
TYPE_NAME
  : IDENTIFIER
  ;
*/

// NOTE difference in handling of leading minus sign compared to HLSL
// grammar

fragment EXPONENT_PART : ('e'|'E') (PLUS | DASH)? ('0'..'9')+ ;

FLOATCONSTANT
  : ('0'..'9')+ '.' ('0'..'9')* (EXPONENT_PART)?
  | '.' ('0'..'9')+ (EXPONENT_PART)?
  ;

fragment DECIMAL_CONSTANT
  : ('1'..'9')('0'..'9')*
  ;

fragment OCTAL_CONSTANT
  : '0' ('0'..'7')*
  ;

fragment HEXADECIMAL_CONSTANT
  : '0' ('x'|'X') HEXDIGIT+
  ;

fragment HEXDIGIT
  : ('0'..'9'|'a'..'f'|'A'..'F')
  ;

INTCONSTANT
  : DECIMAL_CONSTANT
  | OCTAL_CONSTANT
  | HEXADECIMAL_CONSTANT
  ;

fragment BOOLCONSTANT
  : TRUE
  | FALSE
  ;

// TODO(kbr): this needs much more work
field_selection
  : IDENTIFIER
  ;

//LEFT_OP  : '<<';      - reserved
//RIGHT_OP : '>>';      - reserved

INC_OP           : '++';
DEC_OP           : '--';
LE_OP            : '<=';
GE_OP            : '>=';
EQ_OP            : '==';
NE_OP            : '!=';

AND_OP           : '&&';
OR_OP            : '||';
XOR_OP           : '^^';
MUL_ASSIGN       : '*=';
DIV_ASSIGN       : '/=';
ADD_ASSIGN       : '+=';
MOD_ASSIGN       : '%=';
// LEFT_ASSIGN   : '<<=';  - reserved
// RIGHT_ASSIGN  : '>>=';  - reserved
// AND_ASSIGN    : '&=';   - reserved
// XOR_ASSIGN    : '^=';   - reserved
// OR_ASSIGN     : '|=';   - reserved
SUB_ASSIGN       : '-=';

LEFT_PAREN       : '(';
RIGHT_PAREN      : ')';
LEFT_BRACKET     : '[';
RIGHT_BRACKET    : ']';
LEFT_BRACE       : '{';
RIGHT_BRACE      : '}';
DOT              : '.';

COMMA            : ',';
COLON            : ':';
EQUAL            : '=';
SEMICOLON        : ';';
BANG             : '!';
DASH             : '-';
TILDE            : '~';
PLUS             : '+';
STAR             : '*';
SLASH            : '/';
PERCENT          : '%';

LEFT_ANGLE       : '<';
RIGHT_ANGLE      : '>';
VERTICAL_BAR     : '|';
CARET            : '^';
AMPERSAND        : '&';
QUESTION         : '?';

// ----------------------------------------------------------------------
// skipped elements

WHITESPACE
  : ( ' ' | '\t' | '\f' | '\r' | '\n' )
  { $channel = HIDDEN; }
  ;

COMMENT
  : '//' (~('\n'|'\r'))*
  { $channel = HIDDEN; }
  ;

MULTILINE_COMMENT
  : '/*' ( options {greedy=false;} : . )* '*/'
  { $channel = HIDDEN; }
  ;

// ----------------------------------------------------------------------
// Keywords reserved for future use

//RESERVED_KEYWORDS
//  : 'asm'
//  | 'cast'
//  | 'class'
//  | 'default'
//  | 'double'
//  | 'dvec2'
//  | 'dvec3'
//  | 'dvec4'
//  | 'enum'
//  | 'extern'
//  | 'external'
//  | 'fixed'
//  | 'flat'
//  | 'fvec2'
//  | 'fvec3'
//  | 'fvec4'
//  | 'goto'
//  | 'half'
//  | 'hvec2'
//  | 'hvec3'
//  | 'hvec4'
//  | 'inline'
//  | 'input'
//  | 'interface'
//  | 'long'
//  | 'namespace'
//  | 'noinline'
//  | 'output'
//  | 'packed'
//  | 'public'
//  | 'sampler1D'
//  | 'sampler1DShadow'
//  | 'sampler2DRect'
//  | 'sampler2DRectShadow'
//  | 'sampler2DShadow'
//  | 'sampler3D'
//  | 'sampler3DRect'
//  | 'short'
//  | 'sizeof'
//  | 'static'
//  | 'superp'
//  | 'switch'
//  | 'template'
//  | 'this'
//  | 'typedef'
//  | 'union'
//  | 'unsigned'
//  | 'using'
//  | 'volatile'
//  ; 

我尝试通过删除所有语法谓词并在 Xtext 中启用回溯来直接翻译语法。如果可行,我会尝试通过审查 Antlr 发现的所有问题来消除回溯。如果您应用某些最佳实践(例如 Xtext 的操作)来消除左递归,那么您的语法看起来很像回溯是不必要的。您在 Antlr 语法中应用的一些使用模式在 Xtext 中是不允许的,因此我敢打赌,一旦将语法转换为 Xtext 兼容版本,大多数语法谓词将不再需要。

E.g.

primary_expression_or_function_call
  : ( INTCONSTANT ) => primary_expression
  | ( FLOATCONSTANT ) => primary_expression
  | ( BOOLCONSTANT ) => primary_expression
  | ( LEFT_PAREN ) => primary_expression
  | ( function_call_header ) => function_call
  | primary_expression
  ;

实际上是这样的:

  PrimaryExpression:
    IntValue | FloatValue | BooleanValue | Parens | FunctionCall;

with

  IntValue: value=INTCONSTANT;
  ..
  Parens: '(' Expression ')';
  FunctionCall: function=[Function] '(' 
    (arguments+=Expression (',' arguments+=Expression)*)?
  ')'

等等。查看文档了解详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词 的相关文章

  • 如何使用Antlr实现函数调用,以便在定义之前就可以调用它?

    一旦构建了 AST 实现树遍历器以便可以按任意顺序定义和调用函数的最佳方法是什么 例如 这在 PHP 中是有效的 我猜想一定有第二遍 或者树转换 但我在这个主题上找不到任何有趣的东西 这个问题可能不是 Antlr 特有的问题 但如果你能给我
  • ANTLR语法互左递归

    我确实知道这个问题已经被问过很多次了 我正在尝试使用 ANTLR 构建语法 Predicate LOWERCASE Predicate VarChars VarChars LOWERCASE UPPERCASE fragment LOWER
  • 运算符的优先级和结合性是什么?

    C 中运算符的优先级和结合性是什么 谁定义了运算符优先级和结合性 以及它与求值顺序有何关系 https stackoverflow com q 20767745 5740428解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴
  • 编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS

    我在处理空白时遇到一些麻烦 在以下语法摘录中 我设置了词法分析器 以便解析器跳过空格 ENTITY VAR user resource INT DIGIT DIGIT ID LETTER LETTER DIGIT SPECIAL ENTIT
  • 如何捕获 ANTLR4 中的无关输入?

    我想捕获antlr4中的无关错误 它只打印到 stderr 类似的东西 line 1 16 extraneous input three expecting
  • 用于计算上下文无关语法的 FIRST 和 FOLLOW 集的算法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一种算法来计算语法的 FIRST 和 FOLLOW 集 是否有一个简单的算法或简单的代码来计算这些 大多数编译器教科书和解析算法
  • 表示语法中的语句终止换行符?

    许多编程语言都有以行结束符终止的语句 不过 通常情况下 如果解析器无法理解该行 则在语句中间允许使用行结束符 例如 a 3 4 将在 Ruby 和 Python 中解析为语句a 3 4 since a 3 没有任何意义 换句话说 换行符被忽
  • ClassNotFoundException:org.eclipse.xtext.junit_2.4.3.v201309030823 找不到 junit.framework.TestCase

    我对这个错误感到困惑 java lang NoClassDefFoundError junit framework TestCase at java lang ClassLoader defineClass1 Native Method a
  • 不使用左手递归解析布尔表达式

    我正在尝试匹配这个 f some thing something else f 某物 是一个函数调用 它是一个表达式 是一个布尔运算符 别的东西 是一个字符串 也是一个表达式 所以布尔表达式应该是 expression operator e
  • Antlr 语法生成无效的 C# 代码

    我正在尝试使用 ANTLR 和 StringTemplate 库开发一个 C 代码生成器 AntlrWorks 可以生成 C 解析器和词法分析器文件 而不会报告任何错误 但是 c 解析器代码无效 无法在 Visual Studio 中编译
  • ANTLRWorks 1.4.3 无法正确读取扩展 ASCII 字符

    我正在开发一个相当标准的编译器项目 我选择 ANTLR 作为解析器生成器 在将现有语法从 v2 更新到 v3 时 我注意到 ANTLRWorks ANTLR 的官方 IDE 无法正确显示文件中的任何扩展 ASCII 字符 即使使用 Note
  • 对话框中的 Xtext DSL 嵌入式编辑器

    我是 xtext 的新手 我已经使用 xtext 创建了 DSL 并且生成了工件 这生成了具有许多功能 如内容辅助和语法着色 的编辑器 现在的问题是我想将编辑器嵌入到对话框中 为了实现此目的 我使用嵌入式编辑器 我能够获取嵌入式编辑器并将其
  • 将 Xtext 与 StringTemplate 代码生成器链接

    在我当前的项目中 我试图链接用 xtext 编写的 DSL 规范和用 StringTemplate 编写的代码生成器 例如 我的 DSL 规范的语法如下 我通过 xText 提供的优秀编辑器工具输入此信息 structs TempStruc
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • C# ANTLR 语法?

    我正在寻找交钥匙ANTLR http www antlr org C 语法 生成可用的抽象语法树 AST 并且与后端语言无关或以 C C C 或 D 为目标 它不需要支持错误报告 附 我不愿意做任何修复 因为替代方案并不难 这可能太晚了 但
  • 语法的替代版本无法按照我的意愿工作

    这段代码解析 string如我所愿 usr bin env raku my string q to END aaa bbb this has trailing spaces which I want to keep kjkjsdf kjkd
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • ANTLR4 相当于什么!在词法分析器规则中?

    我正在努力将旧的 ANTLR 2 语法转换为 ANTLR 4 但我在字符串规则方面遇到了问题 STRING r n 这创建了一个STRING其文本包含字符串内容的标记 但是不含开始和结束引号 因为 引号文字后面的符号 ANTLR 4 扼流圈
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器

随机推荐

  • PHPcurl:“列表中的未知密码”

    我正在使用以下密码列表curl setopt CURLOPT SSL CIPHER LIST DHE DSS AES256 GCM SHA384 DHE RSA AES256 GCM SHA384 DHE RSA AES256 SHA256
  • 如何包装一个方法,以便在超过指定超时时终止其执行?

    我有一个我想调用的方法 然而 我正在寻找一种干净 简单的方法来杀死它 或者在执行时间太长的情况下强制它返回 我正在使用Java 为了显示 logger info sequentially executing all batches for
  • 从 AWS Lambda 连接到 Redshift

    我正在尝试连接到我的Redshift来自我的数据库AWS Lambda功能 con psycopg2 connect dbname my dbname host my url port 5439 user username password
  • Nodejs crypto.publicEncrypt 在不同的机器上产生不同的结果

    我们正在尝试使用 AWS KMS 中的非对称密钥进行加密和解密 key的配置如下 在 NodeJS 中 我们通过 crypto publicEncrypt 使用公钥进行加密 const encryptRSAPayload buffer pu
  • 什么是mockito-inline以及它如何模拟最终方法?

    Mockito 中的 Javadocs 说 从版本 2 7 6 开始 我们提供了 mockito inline 工件 无需配置 MockMaker 扩展文件即可实现内联模拟制作 这是什么意思 mockito inline 是如何工作的 为什
  • 如何使用 JavaScript 读取文本区域中的文本?

    所以我是 JS 的新手 正在尝试了解基础知识 我决定制作一个基本的网页文本编辑器 现在我正在尝试用 JS 来区分单词 这是我的代码 基本上它确定单词 bob 是否已输入到文本区域中
  • 使用 php 验证链接

    谁能告诉我是否可以用 php 验证链接 通过验证 我的意思是检查链接是否处于活动状态 并且不仅仅是链接的实际格式 您需要执行 HEAD 请求并检查响应 200表示请求成功 还有其他的可以在这里找到 http www w3 org Proto
  • MacPorts 手动端口位置

    我正在从 MacPorts 安装一个 python 库 但macports版本的库比实际开发的svn版本旧 是否可以在 MacPorts 中指定端口安装的自定义位置 以便我可以从开发人员站点安装最新的库 Have http guide ma
  • MySQL 复合索引和运算符 BETWEEN

    我对这个查询有一个疑问 SELECT FROM runs WHERE NOW BETWEEN began at AND finished at 您认为为 begin at 和 finish at 列创建复合索引有意义吗 或者只为 begin
  • 模糊效果在模拟器中显示,但在 iPhone 上不显示

    我想创建一个模糊效果UIImageView与下面的代码 问题是 当我在模拟器中运行它时 我可以看到 BlurEffect 但当我连接 iPhone 时却看不到 这里我只能看到灰色背景 有什么想法吗 这是我使用的代码 import UIKit
  • 如何在 MASM 中编写远绝对 JMP/CALL 指令?

    如何使用 MASM 编写远绝对 JMP 或 CALL 指令 具体来说 如何让它使用 EA 和 CA 操作码发出这些指令 而不使用 DB 或其他数据指令手动发出它们 例如 考虑跳转到引导扇区中 FFFF 0000 处的 BIOS 重置入口点的
  • 使用 python 从 BytesIO 创建 Excel 文件

    我在用pandas用于存储 Excel 的库bytesIO记忆 稍后我会存储这个bytesIO对象导入 SQL Server 如下 df pandas DataFrame data1 columns col1 col2 col3 outpu
  • 非常慢的 HHVM、Wordpress、Nginx

    我可能做错了什么 但我正在 php fpm wordpress 设置和 HHVM wordpress 设置之间进行一些测试 我听过并看到过 HHVM 的许多令人兴奋的结果 但我只是对我得到的结果感到震惊 使用以下 apache 测试命令 我
  • 来自 Android 版 IndexedDB Chrome 中保存的块的 HTML5 视频

    我想使用 IndexedDB 在客户端存储离线 HTML5 应用程序的视频文件 为此 我从服务器 API 中下载了 2 个块的视频 然后我将它们作为 blob 存储在 indexedDB 中 然后在其他页面上我从数据库获取它们并创建新的 b
  • 迭代调用 pandas datareader

    我有一个带有股票列表的 python 字典 我试图在 for 循环中使用键 股票代码 见下文 来迭代地为所有股票 以股票代码命名 创建多个 pandas DataFrame 并通过 pandas DataReader 填充价格 交易量 我认
  • JavaFX和Mac:如何设置窗口关闭按钮修改状态?

    我希望能够设置应用程序的修改状态并将其反映在窗口关闭按钮 即其中的黑点 中 我发现了一个非常好的概述 参见 http nadeausoftware com node 90 http nadeausoftware com node 90 如何
  • 简单 mips 中的无限循环

    我正在尝试了解 ra 所以我想要的输出是 mainfunction1main 通过 main 调用 function1 function1 返回到 main 然后 main 完成 但由于某种原因 我得到一个无限循环 打印 mainfunct
  • 使用参数变量获取传递给 ES6 箭头函数的参数 [重复]

    这个问题在这里已经有答案了 我了解箭头函数在 ES6 中的工作原理以及词法 this 但我想知道是否有人知道如何将参数传递给箭头函数 在 ES5 中 你可以简单地执行以下操作 function foo bar baz console log
  • 使用 Opam 管理项目依赖关系

    我是 OCaml 的新手 我使用过的其他语言 例如 Scala Clojure Node js 上的 Javascript 都有包管理器 允许人们以干净的状态启动项目 该项目具有一组已声明的已知版本的依赖项 我正在尝试与 Opam 做类似的
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

    我对 Xtext 和 ANTLR 都很陌生 我需要将 ANTLR g 语法转换为 XTEXT xtext 语法 在 ANTLR 语法中 存在 Xtext 不支持的语法谓词 有没有办法删除 翻译这些谓词 Thanks EDIT 我尝试翻译的