- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 IntelliJ 编写自定义语言插件。
这是该语言的简化示例。请注意,该结构是递归的:
我已经成功实现了 FLEX 和 BNF 文件,但我不确定如何添加错误恢复。我在 Grammar-Kit 的 HOWTO 中阅读了有关 RecoverWhile 和 pin 的内容,但我不确定如何将它们应用于我的场景。
我称上面的棕色元素(“aaa”、“ccc”等)为“元素”。
我称黄色的(“bbb”、“ddd”、...)为“属性”。
每个项目都有一个项目名称(例如“aaa”)、一个属性(例如“bbb”),并且可以包含其他项目(例如“aaa”包含“ccc”、“eeee”和“gg”)。
目前,当项目格式错误时,该插件表现不佳。例如:
在此示例中,我希望解析器“理解”“ccc”是缺少属性的项目的名称(例如,通过检测右括号前的换行符)。
我不希望损坏的“ccc”项目影响“eeee”的解析(但我确实希望 PSI 树具有文本中存在的“ccc”元素,在这种情况下 - 它的名称)。
这是我使用的 FLEX 和 BNF:
柔性:
CRLF= \n|\r|\r\n
WS=[\ \t\f]
WORD=[a-zA-Z0-9_#\-]+
%state EOF
%%
<YYINITIAL> {WORD} { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_WORD; }
<YYINITIAL> \[ { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_OPEN_SQUARE_BRACKET; }
<YYINITIAL> \] { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_CLOSE_SQUARE_BRACKET; }
<YYINITIAL> \{ { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_OPEN_CURLY_BRACKET; }
<YYINITIAL> \} { yybegin(YYINITIAL); return MyLangTypes.TYPE_FLEX_CLOSE_CURLY_BRACKET; }
({CRLF}|{WS})+ { return TokenType.WHITE_SPACE; }
{WS}+ { return TokenType.WHITE_SPACE; }
. { return TokenType.BAD_CHARACTER; }
myLangFile ::= (item|COMMENT|CRLF)
item ::=
itemName
(TYPE_FLEX_OPEN_SQUARE_BRACKET itemProperty? TYPE_FLEX_CLOSE_SQUARE_BRACKET?)?
itemBody?
itemName ::= TYPE_FLEX_WORD
itemProperty ::= TYPE_FLEX_WORD
itemBody ::= TYPE_FLEX_OPEN_CURLY_BRACKET item* TYPE_FLEX_CLOSE_CURLY_BRACKET
最佳答案
我最终能够让它像这样工作:
myLangFile ::= (item|COMMENT|CRLF)
item ::=
itemName
itemProperties
itemBody?
itemName ::= TYPE_FLEX_WORD
itemProperties ::= TYPE_FLEX_OPEN_SQUARE_BRACKET [!TYPE_FLEX_CLOSE_SQUARE_BRACKET itemProperty ((TYPE_FLEX_SEMICOLON itemProperty)|itemProperty)*] TYPE_FLEX_CLOSE_SQUARE_BRACKET {
pin(".*") = 1
}
itemProperty ::= TYPE_FLEX_WORD TYPE_FLEX_EQUALS? itemPropertyValue? (TYPE_FLEX_EQUALS prv_swallowNextPropertyToPreventSyntaxErrors)?
private prv_swallowNextPropertyToPreventSyntaxErrors ::= TYPE_FLEX_WORD
itemPropertyValue ::= TYPE_FLEX_WORD
itemBody ::= TYPE_FLEX_OPEN_CURLY_BRACKET item* TYPE_FLEX_CLOSE_CURLY_BRACKET
关于parsing - IntelliJ : Grammar-Kit/BNF: how to recover from errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820437/
我正在写一个小语法作为类练习,我的教授并没有真正具体说明什么是合法的 BNF 表达式。 BNF 语法应该识别这种形式的字符串:AB、AABB、AAABBB、A...B...(一般形式:AnBn) 所以
如何将此 BNF 转换为 EBNF? ::= var ; ::= {;} ::= {,} : ::= {} ::= | | _ 最佳答案 EBNF 或 Extended Back
我正在开展一个学校项目,需要我解析 BNF 语法。我有点困惑管道符 (|)(我认为它的意思是“或”)在规则中扮演什么角色。 例如,如果我有以下内容: ::= b c d | e f g 哪个终端是
我需要将以下语法转换为 EBNF: -> = -> A|B|C -> + | * | * |( ) | 我目前取得的进展如下: -> = =
我正在尝试学习 BNF 并尝试组装一些 Z80 ASM 代码。由于我对这两个领域都是新手,我的问题是,我是否走在正确的轨道上?我正在尝试将 Z80 ASM 的格式编写为 EBNF,以便我可以找出从哪里
有谁知道我在哪里可以获得 LOGO 的 BNF 或 EBNF编程语言? 最佳答案 BNF 语法在某些情况下可能不太有用...... 编写一个与现有/历史实现准确兼容的 LOGO 并不是一件容易的事(我
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 1 年前。
最近在想下面的BNF A -> x | yA | yAzA where x,y,z are terminals. 我很确定这个语法是模棱两可的,但是如何使它不含糊呢? 最佳答案 如果一个特定的字符串可
是否有正则表达式的 BNF 语法? 最佳答案 你可以看到一个 Perl regexp (显示 a little more in detail here ,由 edg 发布) 关于正则表达式 BNF 语
我使用这个 BNF 来解析我的脚本: {identset} = {ASCII} - {"\{\}}; //<--all ascii charset except '\"' '{' and '}
无法为字符序列(可能为空)提出 BNF 语法,以逗号分隔,但不以逗号开头或结尾, 所以这没问题: ::= | , | 但这会产生类似 A, :-( 最佳答案 空字符序列给你带来了麻烦。您
我有一项作业要纠正一个不明确的 BNF,但我完全迷失了。我知道这不是一个真正的编程问题,如果这不是这些板的合适问题,我会很乐意删除它。有没有什么好的网站可以让我了解更多有关 BNF 的信息?我正在处理
我该如何描述语言 A → AA | ( A ) | ε 使用正则表达式生成? 最佳答案 正则表达式接受来自正则语言的字符串。 FSM 也可以接受常规语言。 在您的语言中,您必须匹配的括号数量可能是无限
在使用 Prolog DCG 解析输入时,最好有一个语法的 BNF 伴随。 例如: BNF ::= ::= ::= ::= a ::= the ::= cat ::= mou
我需要迭代形式的产生规则的符号: 例如:输入 ::= = | <> | = | > | in ::= | ; 所以我需要派生一个正则表达式来分割文本。这是我到目前为止所拥有的 (?:\s|^
我继承了一个 ANTLR 语法,现在我需要编写一个很好的、古老的、类似 YACC/BISON 的解析器(具体来说,我使用 PLY for python)。有许多奇怪的规则,我现在正在努力解决以下问题:
我需要解析一个不是我设计的简单专有语言,所以我不能改变语言。我需要 C# 中的结果,所以我一直在使用 TinyPG,因为它非常易于使用,并且不需要外部库来运行解析器。 TinyPG 生成一个简单的 L
最近我发现了 python 模块 pyparsing,这是一个通过编写语法而不是解析器来解析数据的好工具。我对上下文无关语法的概念还很陌生,所以请纠正这个问题中的任何错误假设。 Pyparsing 可
好吧,我不确定我应该如何使用递归下降解析来编写一个函数来解析如下语法。事实上,我不确定我是否做对了...... BNF: A : B | A '!' B : '[' ']' 伪代码: f() {
有一个我可以找到流行语言的Backus -Naur形式或BNF语法吗?每当我进行搜索时,我都不会出现太多,但是我认为它们必须在某个地方出版。我最有兴趣看到一个用于Objective-C和MySQL的一
我是一名优秀的程序员,十分优秀!