- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们已经获得了使用 Java CC 进行修补和解析的语法。它的问题之一是“(...)*”内的扩展可以与空字符串匹配。我理解这个错误是因为某些东西可以在可以匹配零次或多次的东西内部匹配零次或多次而引起的。
我不明白的是如何解决它。 (我们的老师并没有说太多,“你必须小心你的措辞。”
语法的问题区域及其相关的 Java CC 代码如下所示。任何想法或建议将不胜感激。
program := ( decl )*
( function ) *
main_prog
decl := ( var_decl | const_decl )*
var_decl := var ident_list : type ( , ident_list : type)* ;
const_decl := const identifier : type = expression ( , identifier : type = expression)* ;
function :=
type identifier ( param_list)
( decl )*
( statement ; )*
return ( expression | e ); //e is greek epsilon character
main_prog :=
main
( decl ) *
(statement ; )*
我认为问题在于 decl 的声明方式。它在实际的 Java CC 代码中声明如下:
void decl():{}
{
( var_decl() | const_decl())*
}
如果我将上面的 Kleene 闭包更改为 + ,由此引起的所有其他错误都会消失。然而教练说星星应该保留,我们需要小心措辞。我发现了很多关于左分解、左递归删除等的资源,但关于这个特定问题的资源却很少。上面的代码实际上在 Java CC 中并没有错误,但会导致以下进一步的错误:
void program():{}
{
( decl() )* //error here - Expansion within "(...)*" can be matched by empty string
( function() )*
main_prog()
}
void main_prog(): {}
{
< MAIN >
( decl() )* //same error on this line
(statement() < SCOLON >)*
}
void function(): {}
{
type() < ID > <LPARENT > param_list() < RPARENT >
( decl() )* //same error on this line
( statement() < SCOLON > )*
< RET> ( expression() | {} ) <SCOLON > // {} is epsilon
}
任何有关如何解决此问题的想法将不胜感激。
最佳答案
就目前情况而言,你的语法不明确 - 它说 decl
表示零个或多个声明,并且有很多地方允许零个或多个 decl
s。你不需要*
在这两个地方,只需选择一个或另一个,任何一种方法都会解析相同的程序,但它们在概念上略有不同。
您可以取出*
在decl
:
decl := ( var_decl | const_decl )
program := ( decl )*
( function ) *
main_prog
所以decl
代表一个单个声明,以及 program
可能以 decl
序列开头但不必这样做。或者,您可以保留 *
在decl
但从引用它的地方取出它:
decl := ( var_decl | const_decl )*
program := decl
( function ) *
main_prog
现在decl
代表类似于“声明 block ”而不是单个声明 - 每个 program
必须以声明 block 开头,但该 block 本身允许为空。
关于Java CC 问题 - "Expansion within "(...) *"can be matched by empty string",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20283556/
我为一个项目创建了一个基于 Java 的 tic-tac-toe 游戏。该游戏有一个带有 Jbutton 的 Jframe 显示,可通过事件监听器响应鼠标点击。 GUI 显示可通过拖动边缘来扩展。但是
我知道 mat-expansion-panel-headers 是一个按钮。单击该按钮上的任意位置可切换扩展的打开/关闭。但我不想让用户单击标题上的任何位置并打开它。应该有一个小按钮。单击该按钮将打开
我想做一些图像预处理,但有一个步骤我不确定最好的方法。 我有带有注释的有趣区域的 MRI 图像,我检测轮廓并裁剪图像: 我将在此处发布我的代码,以便您了解我如何完成前面的步骤以及我们拥有的数据 low
我无法以编程方式添加 mat-expansion-panel。我想在用户通过单击按钮调用函数时添加它们。根据需要多次添加扩展面板。 我尝试为 mat-expansion 添加 HTML 标签,这是一种
这个问题在这里已经有了答案: Dynamic variable names in Bash (17 个回答) 5年前关闭。 我能够批量执行以下操作,但是在我的一生中,我无法弄清楚如何在 bash 中执
在 makefile 中,我使用 define 指令定义一个变量。该变量将保存我想要执行的可配置命令列表。 我希望此变量获取文件列表(例如 .foo 文件)。这些文件是在 makefile 执行期间创
Cantor expansion自然数n的是 n = ak * k!+a(k − 1) *(k −1)!+.... + a2 * 2!+a1 *1! 其中所有的ai(数字)满足0≤ai≤i 我知道它
有什么办法可以关闭这里文档中的参数扩展吗? shell 命令: $ cat > analyze.sh tmp awk -F '(' '{print $NF}' asr.log | awk '{pr
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why i am not getting the expected output in the follow
默认情况下,当用户单击标题中的任意位置时,Angular 扩展面板会展开。但是我想更新此功能,以便只有右侧箭头按钮应该触发扩展事件。有人可以帮助我实现这一目标吗?下面是一个示例代码。 https://
我有一个 formArray与多个 formGroups .每个formGroup位于扩展面板内。现在当我点击 "Check what's missing"按钮,表单验证运行并显示无效表单字段的错误。
我正在尝试使用 *ngFor 在 Mat-accordian 中显示多个 Mat-expansion-panel。我需要点击一个我能够做到的按钮来添加一个新的垫子扩展面板。我还需要在单击按钮时展开(打
“变量扩展”是什么意思?它的意思只是“变量定义”,还是其他什么意思? 当我说setLocal EnableDelayedExpansion时会发生什么? Google 并不清楚。 最佳答案 变量扩展表
参见 this Stackblitz . Angular 材mat-expansion-panel允许 lazy rendering , This is the expansion t
这个问题在这里已经有了答案: Explanation of colon operator in ": ${foo=value}" (2 个答案) 关闭 7 年前。 试图理解用 bash 编写的 do
我想知道是否有办法为已禁用的 Mat-Expansion-Panel 设置样式。我在标题中有按钮并与它们交互会切换面板,所以我相信最好只用按钮切换面板并禁用面板本身。 但是,当我禁用面板时,面板内的所
Bash 具有称为历史扩展的功能,您可以使用快捷方式扩展到您之前在 bash 中键入的内容。 示例:!! - 扩展为之前的命令 $> rm -f /var/log/access.log rm: /va
我正在编写 CSS 来更改焦点和悬停时文本和箭头指示器的颜色。然而,指示器箭头单独起作用。当您将鼠标悬停在整个面板上时,我希望它发生变化。目前箭头指示器只有当你直接悬停在它上面时才会改 rebase
我添加了 Angular material mat-expansion-panel 到 select option ,当我点击选择菜单时,mat-expansion-panel 自动打开,任何人都知道
问题: 是否可以让一个函数接收一个既有百分号又有感叹号的参数? 问题: 我在 FOR/D 中以这种方式处理目录: FOR /D %%d IN ("%~1\*") DO ( CALL :proc
我是一名优秀的程序员,十分优秀!