我如何解释这个输入?

2024-01-08

我目前使用 ANTLR 在 Java 中实现了一种可用的、简单的语言。我想做的是将其嵌入纯文本中,与 PHP 类似。

例如:

Lorem ipsum dolor sit amet
<% print('consectetur adipiscing elit'); %>
Phasellus volutpat dignissim sapien.

我预计生成的令牌流将类似于:

CDATA OPEN PRINT OPAREN APOS STRING APOS CPAREN SEMI CLOSE CDATA

我怎样才能实现这个目标,或者有更好的方法吗?

对于可能超出范围的内容没有任何限制<%堵塞。我假设类似<% print('%>'); %>根据 Michael Mrozek 的回答,这是可能的,但在这种情况之外,<%总是指示代码块的开始。


实施示例

我根据 Michael Mrozek 的答案中给出的想法开发了一个解决方案,使用 ANTLR 的门控语义谓词模拟 Flex 的启动条件:

lexer grammar Lexer;

@members {
    boolean codeMode = false;
}

OPEN    : {!codeMode}?=> '<%' { codeMode = true; } ;
CLOSE   : {codeMode}?=> '%>' { codeMode = false;} ;
LPAREN  : {codeMode}?=> '(';
//etc.

CHAR    : {!codeMode}?=> ~('<%');


parser grammar Parser;

options {
    tokenVocab = Lexer;
    output = AST;
}

tokens {
    VERBATIM;
}

program :
    (code | verbatim)+
    ;   

code :
    OPEN statement+ CLOSE -> statement+
    ;

verbatim :
    CHAR -> ^(VERBATIM CHAR)
    ;

但在这种情况之外,

在这种情况下,首先扫描文件中的嵌入代码,一旦获得这些代码,就使用专用解析器解析嵌入代码(没有之前的噪音)<%并在之后%> tags).

ANTLR 可以选择让词法分析器仅解析输入文件的一小部分并忽略其余部分。请注意,在这种情况下,您无法创建“组合语法”(解析器和词法分析器合二为一)。以下是创建这样一个“部分词法分析器”的方法:

// file EmbeddedCodeLexer.g
lexer grammar EmbeddedCodeLexer;

options{filter=true;} // <- enables the partial lexing!

EmbeddedCode
  :  '<%'                            // match an open tag
     (  String                       // ( match a string literal
     |  ~('%' | '\'')                //   OR match any char except `%` and `'`
     |  {input.LT(2) != '>'}?=> '%'  //   OR only match a `%` if `>` is not ahead of it
     )*                              // ) <- zero or more times
     '%>'                            // match a close tag
  ;

fragment
String
  :  '\'' ('\\' . | ~('\'' | '\\'))* '\''
  ;

如果您现在从中创建一个词法分析器:

java -cp antlr-3.2.jar org.antlr.Tool EmbeddedCodeLexer.g 

并创建一个小测试工具:

import org.antlr.runtime.*;

public class Main {
    public static void main(String[] args) throws Exception {
        String source = "Lorem ipsum dolor sit amet       \n"+
                "<%                                       \n"+
                "a = 2 > 1 && 10 % 3;                     \n"+
                "print('consectetur %> adipiscing elit'); \n"+
                "%>                                       \n"+
                "Phasellus volutpat dignissim sapien.     \n"+
                "foo <% more code! %> bar                 \n";
        ANTLRStringStream in = new ANTLRStringStream(source);
        EmbeddedCodeLexer lexer = new EmbeddedCodeLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        for(Object o : tokens.getTokens()) {
            System.out.println("=======================================\n"+
                    "EmbeddedCode = "+((Token)o).getText());
        }
    }
}

全部编译:

javac -cp antlr-3.2.jar *.java

最后通过执行以下操作来运行主类:

// *nix/MacOS
java -cp .:antlr-3.2.jar Main

// Windows
java -cp .;antlr-3.2.jar Main 

它将产生以下输出:

=======================================
EmbeddedCode = <%                                       
a = 2 > 1 && 10 % 3;                     
print('consectetur %> adipiscing elit'); 
%>
=======================================
EmbeddedCode = <% more code! %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何解释这个输入? 的相关文章

  • 使用 ANTLR 构建自己的 C# 编译器:编译单元

    Create a scanner that reads from the input stream passed to us CSLexer lexer new CSLexer new ANTLRFileStream f tokens To
  • 不同状态下不同的词法分析器规则

    我一直在为 HTML 中嵌入的某些模板语言 FreeMarker 开发解析器 例如 abc h1 Welcome user lt if user Big Joe gt our beloved leader h1 p Our latest p
  • 如何使用 C# 的 ANTLR 获取 Lexer 和 Parser?

    似乎 ANTLR 支持 C 语言 但我不知道如何生成相关类 我搜索并看到存在 Visual Studio 扩展 但我不支持 2015 那么如何使用 ANTLR 手动为 C 生成词法分析器和解析器 VS 扩展主要用于语法突出显示和编辑器细节
  • 我们什么时候使用ANTLR

    谁能指导我在 ASP Net C 项目中使用 ANTLR dll 的目的 我刚刚注意到antlr 运行时 Antlr3 运行时 Antlr3 实用程序某些项目中引用的程序集 如果能引用一些现实世界的例子或者任何指向网页的链接都会有用 那就太
  • 来自 bison 的 ANTLR 语法

    我正在尝试将语法从 bison 翻译为 ANTLR 野牛的语法本身非常简单 但我找不到简单的方法来做到这一点 野牛语法 expr expr or expr expr and expr expr 欢迎任何提示 链接 指针 谢谢 尤利安 在AN
  • 使用 Antlr 获取标识符和函数名称

    我正在尝试使用和理解 AntLR 这对我来说是新的 我的目的是读取用 C 编写的源代码文件并从中提取标识符 变量和函数名称 在我的 C 语法中 文件C g4 考虑 identifierList Identifier identifierLi
  • ANTLR:从不同的语法调用规则

    是否可以从不同的语法调用规则 目的是在同一个文件中包含两种语言 第二种语言以 begin 开头 其中 是第二种语言 该语法应该调用另一个语法来解析该第二种语言 例如 grammar A start rule begin B program
  • ANTLR语法互左递归

    我确实知道这个问题已经被问过很多次了 我正在尝试使用 ANTLR 构建语法 Predicate LOWERCASE Predicate VarChars VarChars LOWERCASE UPPERCASE fragment LOWER
  • PLY - 返回多个令牌

    AFAIK 词法 Python 源代码的技术是 当当前行的缩进级别小于前一行的缩进级别时 产生 DEDENT 如果要关闭多个 INDENT 则生成多个 DEDENT 当到达输入末尾时 如果存在未闭合的 INDENT 则生成 DEDENT 现
  • yytext[0]是什么意思?

    yytext 0 是什么意思 为什么我们要在 lex 和 yacc 程序中使用 我是学习者 所以不要介意这是一个愚蠢的问题 yytext 保存与当前标记匹配的文本 因此 yytext 0 保存与当前标记匹配的文本的第一个字符 有时您有一个可
  • ANTLR:乘法省略“*”符号

    我正在尝试创建一个用于乘法和除法的语法 其中不需要包含 符号 我需要它来输出 AST 所以对于这样的输入 1 2 3 4 我希望 AST 是 1 2 3 4 我发现了以下内容 它使用 java 代码来创建适当的节点 grammar Test
  • 将 ANTLR 语法翻译为 XText 语法:如何删除句法谓词

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

    该指令在 flex lex 中意味着什么 define yywrap 1 和这个 t 我在下面的代码中找到它 t putchar t 输入 你好世界 输出 你好世界 根据Lex 和 Yacc 页面 http dinosaur compile
  • 无法在 JavaCC 中加载主类

    我是人工智能学生 我们使用 JavaCC 我是新来的 我正在尝试简单的例子 但出现了一些错误 1 我从它的网站下载了JavaCC 0 6 2 我把它解压到C盘 3 我将此代码写入扩展名为 jj 的文件中 PARSE BEGIN Test i
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • 自动解析 PHP,将 PHP 代码与 HTML 分离

    我正在开发一个大型 PHP 代码库 我想将 PHP 代码与 HTML 和 JavaScript 分开 我需要对 PHP 代码进行多次自动搜索和替换 对 HTML 进行不同的搜索和替换 对 JS 进行不同的自动搜索和替换 有没有一个好的解析器
  • 使用 ANTLR 验证 LL(1) 语法

    我知道 ANTLR 可以接受 LL 语法 但是 有什么方法可以使用 ANTLR 检查语法是否是 LL 1 吗 options k 1 如果你的语法不在 LL 1 中 它会发出警告
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • antlr4-tool 在 Win10 中失败,并显示:错误:命令失败:哪个 java

    在Win10中运行 为了尝试在Node JS中创建解析器 我安装了ANTLR4工具 npm install save dev antlr4 tool Ran c prj parser node modules bin antlr4 tool
  • 在Python中高效匹配多个正则表达式

    当你有正则表达式时 词法分析器就很容易编写 今天我想用Python写一个简单的通用分析器 并想出了 import re import sys class Token object A simple Token structure Conta

随机推荐

  • 一般填充不同的类成员

    我正在开发一个具有多个 11 Web 服务调用的 Web 服务应用程序 对于每个 Web 服务 我需要从字符串数组填充 Soap Body 如下所示 if aMessage int DCSSCustomerUpdate V3 Branch
  • 假设浮点数在 C 中使用 IEEE754 浮点数表示是否安全?

    浮点是在 C 中定义的实现 因此没有任何保证 我们的代码需要可移植 我们正在讨论是否可以在我们的协议中使用 IEEE754 浮点 出于性能原因 如果我们在发送或接收数据时不必在定点格式之间来回转换 那就太好了 虽然我知道平台和架构之间在大小
  • Pandas Dataframe 分组和标准差

    给定一个以下格式的 pandas 数据框 GroupNo at1 at2 at3 at4 1 0 02 1 12 1 88 3 2 1 6 11 1 13 0 88 5 2 4 2 02 1 16 2 88 0 2 3 0 20 0 12
  • 中的 ListBoxItem 样式?

    我可以放一个xamlStyle for ListBoxItem in
  • 用户位置的自定义注释视图不移动地图视图

    我们可以在 iOS 中为用户当前位置提供自定义注释视图吗 我需要用我自己的自定义视图 比如一些 ping 引脚 删除蓝点 带圆圈 是否有可能做到这一点 如果我们这样做 当用户位置发生变化时 该图钉是否会移动到新位置 或者我们需要以编程方式处
  • node.js websocket 模块已安装,但无法在脚本中运行

    我刚刚安装了node js microsoft Visual 以便能够安装websocket 它安装得很好 C Users Administrator gt npm install websocket npm http GET https
  • 为 linq groupby 编写自定义比较器

    同样 这个示例是我的实际问题的一个非常简化的版本 涉及 linq 分组的自定义比较器 我做错了什么 下面的代码产生下面的结果 1 2 0 4 1 0 4 1 0 1 1 0 然而我期待以下结果 因为 1 1 和 1 2 之间的距离 clas
  • 改变这是什么

    有没有办法改变 THIS 指向的内容 class foo foo fooinstance new foo foo otherfooinstance new foo void foo bar this otherfooinstance foo
  • 错误号2058无法加载插件authentication_windows_client:找不到指定的模块

    MySQL 有一个插件 允许根据当前用户的 Windows 凭据进行用户身份验证 该插件是 authentication windows dll 我从 SQLyog 收到以下错误消息 错误号 2058 插件authentication wi
  • 更改 Flash 播放器音频输出设备

    有没有办法改变Flash播放器的音频输出设备 如果没有的话 有没有swf播放器有这种可能性 谢谢 直到几分钟前我才遇到一个关于此的问题 我的 XP 盒子有两个音频设备 一个 iMic USB 音频 I O 设备 我已将桌面扬声器永久插入其中
  • 如何从反应应用程序中的公共文件夹导入文件?

    我在 public 文件夹中有一个 javascript 文件 我想将该文件导入到文件夹 src components 中的组件 projectFolder publicFolder index html recorder js srcFo
  • eclipse 从 root 显示 README

    以下项目结构并不罕见 项目A 目录 项目B 目录 ProjectX 目录 变更日志 文件 许可证 文件 自述文件 文件 这种结构 README 位于根目录中 得到了不同在线 Git 解决方案 如 github com bitbucket o
  • MDX - NON EMPTY 函数更快?

    我当时的假设是NON EMPTY必须尽可能避免使用该子句 因此 当我意外地发现它实际上使查询速度更快时 我感到震惊 示例如下 select Measures Count Of Requests on 0 Client Client Numb
  • Laravel - 与软删除数据的隐式路由模型绑定

    我有一个小问题 有两种用户角色 一种是普通成员 一种是管理员 成员可以删除博客 并且在删除 软删除 博客后他们将无法看到该博客 而管理员仍然可以看到该博客 即使它是软删除的 示例代码 Route file Route get blog bl
  • AngularJS 指令链接函数未被调用

    我正在尝试将 Angular http auth 库与引导模式窗口一起使用 模态框工作正常 但我在指令方面遇到问题 这是一个 jsfiddle 链接 http jsfiddle net jCUSh 85 http jsfiddle net
  • Android - 从Webview调用Java

    我想从Webview调用Java I have JavaScriptInterface below class JavaScriptInterface private Activity activity public JavaScriptI
  • Rails 4.0.1 中的新记录“没有将符号显式转换为字符串”(仅限)

    在我升级 Rails 4 后 尝试为我的任何 ActiveRecord 类创建新记录会给出 No explicit conversion of Symbol into String 例如 这是我的 links links params 方法
  • 在 FLASK 中运行 pypupeteer 会出现 ValueError: signal only Works in main thread

    我正在尝试将 pyppeteer 集成到 Flask 应用程序中 我有一个运行 pyppeteer 并截取页面屏幕截图的 python 脚本 如果我单独运行该脚本 这是工作文件 The PROBLEM当我在 FLASK 应用程序中运行它时
  • c++ - 不命名类型

    我有一个问题 当我尝试构建以下代码时 我得到 keywords does not name a type whitespace does not name a type 第 18 19 行和第 22 24 行 有人可以帮忙吗 这是代码 cp
  • 我如何解释这个输入?

    我目前使用 ANTLR 在 Java 中实现了一种可用的 简单的语言 我想做的是将其嵌入纯文本中 与 PHP 类似 例如 Lorem ipsum dolor sit amet Phasellus volutpat dignissim sap